blob: 2f675926fbc415630d8233bd8e33822372458c07 [file] [log] [blame]
/*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You under the Apache License, Version 2.0
* (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*
*/
package org.apache.skywalking.oap.server.analyzer.provider.trace.parser.listener;
import lombok.Getter;
import lombok.Setter;
import org.apache.skywalking.oap.server.core.analysis.Layer;
import org.apache.skywalking.oap.server.core.config.NamingControl;
import org.apache.skywalking.oap.server.core.source.EndpointRelation;
import org.apache.skywalking.oap.server.core.source.Service;
import org.apache.skywalking.oap.server.core.source.ServiceInstance;
import org.apache.skywalking.oap.server.core.source.ServiceInstanceRelation;
import org.apache.skywalking.oap.server.core.source.ServiceRelation;
import org.apache.skywalking.oap.server.library.util.StringUtil;
/**
* @since 9.0.0 Rename "SourceBuilder` to this. Add {@link EndpointSourceBuilder} for making source builder more specific.
*
* RPC traffic could be detected by server side or client side according to agent tech stack.
*/
class RPCTrafficSourceBuilder extends EndpointSourceBuilder {
@Getter
@Setter
private String sourceServiceName;
@Getter
@Setter
private Layer sourceLayer;
@Getter
@Setter
private String sourceServiceInstanceName;
/**
* Same as {@link #sourceEndpointOwnerServiceName}
* Source endpoint could be not owned by {@link #sourceServiceName}, such as in the MQ or un-instrumented proxy
* cases. This service always comes from the span.ref, so it is always a general service.
*
* @since 9.0.0
*/
@Getter
@Setter
private Layer sourceEndpointOwnerServiceLayer;
/**
* Source endpoint could be not owned by {@link #sourceServiceName}, such as in the MQ or un-instrumented proxy
* cases. This service always comes from the span.ref, so it is always a general service.
*/
@Getter
@Setter
private String sourceEndpointOwnerServiceName;
@Getter
@Setter
private String sourceEndpointName;
@Getter
@Setter
private int componentId;
RPCTrafficSourceBuilder(final NamingControl namingControl) {
super(namingControl);
}
void prepare() {
this.sourceServiceName = namingControl.formatServiceName(sourceServiceName);
this.sourceEndpointOwnerServiceName = namingControl.formatServiceName(sourceEndpointOwnerServiceName);
this.sourceServiceInstanceName = namingControl.formatInstanceName(sourceServiceInstanceName);
this.sourceEndpointName = namingControl.formatEndpointName(sourceServiceName, sourceEndpointName);
super.prepare();
}
/**
* Service meta and metrics related source of {@link #destServiceName}. The metrics base on the OAL scripts.
*/
Service toService() {
Service service = new Service();
service.setName(destServiceName);
service.setServiceInstanceName(destServiceInstanceName);
service.setEndpointName(destEndpointName);
service.setLayer(destLayer);
service.setLatency(latency);
service.setStatus(status);
service.setHttpResponseStatusCode(httpResponseStatusCode);
service.setRpcStatusCode(rpcStatusCode);
service.setType(type);
service.setTags(tags);
service.setTimeBucket(timeBucket);
service.setOriginalTags(originalTags);
return service;
}
/**
* Service topology meta and metrics related source. The metrics base on the OAL scripts.
*/
ServiceRelation toServiceRelation() {
ServiceRelation serviceRelation = new ServiceRelation();
serviceRelation.setSourceServiceName(sourceServiceName);
serviceRelation.setSourceServiceInstanceName(sourceServiceInstanceName);
serviceRelation.setSourceLayer(sourceLayer);
serviceRelation.setDestServiceName(destServiceName);
serviceRelation.setDestServiceInstanceName(destServiceInstanceName);
serviceRelation.setDestLayer(destLayer);
serviceRelation.setEndpoint(destEndpointName);
serviceRelation.setComponentId(componentId);
serviceRelation.setLatency(latency);
serviceRelation.setStatus(status);
serviceRelation.setHttpResponseStatusCode(httpResponseStatusCode);
serviceRelation.setRpcStatusCode(rpcStatusCode);
serviceRelation.setType(type);
serviceRelation.setDetectPoint(detectPoint);
serviceRelation.setTimeBucket(timeBucket);
return serviceRelation;
}
/**
* Service instance meta and metrics of {@link #destServiceInstanceName} related source. The metrics base on the OAL
* scripts.
*/
ServiceInstance toServiceInstance() {
ServiceInstance serviceInstance = new ServiceInstance();
serviceInstance.setName(destServiceInstanceName);
serviceInstance.setServiceName(destServiceName);
serviceInstance.setServiceLayer(destLayer);
serviceInstance.setEndpointName(destEndpointName);
serviceInstance.setLatency(latency);
serviceInstance.setStatus(status);
serviceInstance.setHttpResponseStatusCode(httpResponseStatusCode);
serviceInstance.setRpcStatusCode(rpcStatusCode);
serviceInstance.setType(type);
serviceInstance.setTags(tags);
serviceInstance.setOriginalTags(originalTags);
serviceInstance.setTimeBucket(timeBucket);
return serviceInstance;
}
/**
* Service instance topology/dependency meta and metrics related source. The metrics base on the OAL scripts.
*/
ServiceInstanceRelation toServiceInstanceRelation() {
if (StringUtil.isEmpty(sourceServiceInstanceName) || StringUtil.isEmpty(destServiceInstanceName)) {
return null;
}
ServiceInstanceRelation serviceInstanceRelation = new ServiceInstanceRelation();
serviceInstanceRelation.setSourceServiceName(sourceServiceName);
serviceInstanceRelation.setSourceServiceInstanceName(sourceServiceInstanceName);
serviceInstanceRelation.setSourceServiceLayer(sourceLayer);
serviceInstanceRelation.setDestServiceName(destServiceName);
serviceInstanceRelation.setDestServiceInstanceName(destServiceInstanceName);
serviceInstanceRelation.setDestServiceLayer(destLayer);
serviceInstanceRelation.setEndpoint(destEndpointName);
serviceInstanceRelation.setComponentId(componentId);
serviceInstanceRelation.setLatency(latency);
serviceInstanceRelation.setStatus(status);
serviceInstanceRelation.setHttpResponseStatusCode(httpResponseStatusCode);
serviceInstanceRelation.setRpcStatusCode(rpcStatusCode);
serviceInstanceRelation.setType(type);
serviceInstanceRelation.setDetectPoint(detectPoint);
serviceInstanceRelation.setTimeBucket(timeBucket);
return serviceInstanceRelation;
}
/**
* Endpoint dependency meta and metrics related source. The metrics base on the OAL scripts.
*/
EndpointRelation toEndpointRelation() {
if (StringUtil.isEmpty(sourceEndpointName) || StringUtil.isEmpty(destEndpointName)) {
return null;
}
EndpointRelation endpointRelation = new EndpointRelation();
endpointRelation.setEndpoint(sourceEndpointName);
if (sourceEndpointOwnerServiceName == null) {
endpointRelation.setServiceName(sourceServiceName);
endpointRelation.setServiceLayer(sourceLayer);
} else {
endpointRelation.setServiceName(sourceEndpointOwnerServiceName);
endpointRelation.setServiceLayer(sourceEndpointOwnerServiceLayer);
}
endpointRelation.setServiceInstanceName(sourceServiceInstanceName);
endpointRelation.setChildEndpoint(destEndpointName);
endpointRelation.setChildServiceName(destServiceName);
endpointRelation.setChildServiceLayer(destLayer);
endpointRelation.setChildServiceInstanceName(destServiceInstanceName);
endpointRelation.setComponentId(componentId);
endpointRelation.setRpcLatency(latency);
endpointRelation.setStatus(status);
endpointRelation.setHttpResponseStatusCode(httpResponseStatusCode);
endpointRelation.setRpcStatusCode(rpcStatusCode);
endpointRelation.setType(type);
endpointRelation.setDetectPoint(detectPoint);
endpointRelation.setTimeBucket(timeBucket);
return endpointRelation;
}
}