Code Block |
---|
| cps-ncmp-rest
@Timed(value = "cps.ncmp.controller.get", description = "Time taken to get resource data from datastore")
@Timed(value = "cps.ncmp.inventory.controller.update",
cps-ncmp-service
@Timed(value = "cps.ncmp.dmi.get",
@Timed(value = "cps.ncmp.inventory.persistence.schemaset.delete",
@Timed(value = "cps.ncmp.inventory.persistence.schemaset.delete.batch",
@Timed(value = "cps.ncmp.inventory.persistence.datanode.get",
@Timed(value = "cps.ncmp.inventory.persistence.datanode.get",
@Timed(value = "cps.ncmp.cmhandle.state.update.batch",
cps-rest
@Timed(value = "cps.rest.admin.controller.schemaset.create",
@Timed(value = "cps.data.controller.datanode.get.v1",
@Timed(value = "cps.data.controller.datanode.get.v2",
@Timed(value = "cps.data.controller.get.delta",
@Timed(value = "cps.data.controller.datanode.query.v1",
@Timed(value = "cps.data.controller.datanode.query.v2",
@Timed(value = "cps.data.controller.datanode.query.across.anchors",
cps-ri
@Timed(value = "cps.data.persistence.service.datanode.query",
@Timed(value = "cps.data.persistence.service.datanode.query.anchors",
@Timed(value = "cps.data.persistence.service.datanode.get",
@Timed(value = "cps.data.persistence.service.datanode.batch.get",
cps-service
@Timed(value = "cps.data.service.datanode.root.save",
@Timed(value = "cps.data.service.datanode.child.save",
@Timed(value = "cps.data.service.list.element.save",
@Timed(value = "cps.data.service.datanode.get",
@Timed(value = "cps.data.service.datanode.batch.get",
@Timed(value = "cps.data.service.datanode.leaves.update",
@Timed(value = "cps.data.service.datanode.leaves.descendants.leaves.update",
@Timed(value = "cps.data.service.get.delta",
@Timed(value = "cps.data.service.get.deltaBetweenAnchorAndPayload",
@Timed(value = "cps.data.service.datanode.descendants.update",
@Timed(value = "cps.data.service.datanode.descendants.batch.update",
@Timed(value = "cps.data.service.list.update",
@Timed(value = "cps.data.service.list.batch.update",
@Timed(value = "cps.data.service.datanode.delete",
@Timed(value = "cps.data.service.datanode.batch.delete",
@Timed(value = "cps.data.service.datanode.delete.anchor",
@Timed(value = "cps.data.service.datanode.delete.anchor.batch",
@Timed(value = "cps.data.service.list.delete",
@Timed(value = "cps.module.service.schemaset.create",
@Timed(value = "cps.module.service.module.reference.query",
@Timed(value = "cps.data.service.datanode.query",
@Timed(value = "cps.dataupdate.events.publish", description = "Time taken to publish Data Update event")
@Timed(value = "cps.utils.yangparser.nodedata.with.parent.parse",
@Timed(value = "cps.utils.yangparser.nodedata.with.parent.with.yangResourceMap.parse",
@Timed(value = "cps.yangtextschemasourceset.build",
@Timed(value = "cps.yang.schemasourceset.build", description = "Time taken to build a ODL yang Model")
|
| | |
OpenTelemetry | end-to-end tracing (tracing requests across services) OpenTelemetry - open-source set of APIs, libraries, agents, and instrumentation to monitor application. Allows to collect metrics, logs, and traces Jaeger - open-source distributed tracing system used with OpenTelemetry to visualise traces and understand flow of requests ** we use OpenTelemetry to send trace data to Jaeger and view it in Jaeger UI Annotation and set up OpenTelemetryConfig.java Code Block |
---|
@Value("${spring.application.name:cps-application}")
private String serviceId;
@Value("${cps.tracing.exporter.endpoint:http://onap-otel-collector:4317}")
private String tracingExporterEndpointUrl;
@Value("${cps.tracing.sampler.jaeger_remote.endpoint:http://onap-otel-collector:14250}")
private String jaegerRemoteSamplerUrl;
@Value("${cps.tracing.excluded-observation-names:tasks.scheduled.execution}")
private String excludedObservationNamesAsCsv; |
serviceId : states the application to be monitored tracingExporterEndpointUrl : (OpenTelemetry collector endpoint) this is where traced data by openTelemetry will be exported jaegerRemoteSamplerUrl : (remote sampler endpoint) this controls the sampling trace behaviour
Code Block |
---|
| @Bean
@ConditionalOnExpression(
"${cps.tracing.enabled} && 'grpc'.equals('${cps.tracing.exporter.protocol}')")
public OtlpGrpcSpanExporter createOtlpExporterGrpc() {
return OtlpGrpcSpanExporter.builder().setEndpoint(tracingExporterEndpointUrl).build();
}
@Bean
@ConditionalOnExpression(
"${cps.tracing.enabled} && 'http'.equals('${cps.tracing.exporter.protocol}')")
public OtlpHttpSpanExporter createOtlpExporterHttp() {
return OtlpHttpSpanExporter.builder().setEndpoint(tracingExporterEndpointUrl).build();
}
|
Code Block |
---|
@Bean
@ConditionalOnProperty("cps.tracing.enabled")
public JaegerRemoteSampler createJaegerRemoteSampler() {
return JaegerRemoteSampler.builder()
.setEndpoint(jaegerRemoteSamplerUrl)
.setPollingInterval(Duration.ofSeconds(JAEGER_REMOTE_SAMPLER_POLLING_INTERVAL_IN_SECONDS))
.setInitialSampler(Sampler.alwaysOff())
.setServiceName(serviceId)
.build();
} |
Code Block |
---|
@Bean
@ConditionalOnProperty("cps.tracing.enabled")
public ObservationRegistryCustomizer<ObservationRegistry> skipActuatorEndpointsFromObservation() {
final PathMatcher pathMatcher = new AntPathMatcher("/");
return registry ->
registry.observationConfig().observationPredicate(observationPredicate(pathMatcher));
}
private ObservationPredicate observationPredicate(final PathMatcher pathMatcher) {
return (observationName, context) -> {
if (context instanceof ServerRequestObservationContext observationContext) {
return !pathMatcher.match("/actuator/**", observationContext.getCarrier().getRequestURI());
} else {
return !excludedObservationNames.contains(observationName);
}
};
} |
| | | ** Trace shows the journey of the request flow. It is made up of spans which shows each operations ** Each span has metadata: id ,start and end time, operation name (i.e. HTTP GET), status code, response time etc..
What gets traced? HTTP Requests (Inbound) when requests comes in , trace is generated. The span for this could have http method, url path, status code, time taken to process the request etc…
Internal
|