Кажется, все работает, за исключением того, что мне не удается заставить приложение Spring Boot отправлять журналы сборщику OTEL.
Поскольку я не смог найти очень четких инструкций, как это сделать, Я просто соединяю вещи, например из этих двух и других:
- https://github.com/open-telemetry/opent ... ssues/7723
- https://github.com/ff-sdesai/distribute ... ck.xml#L17
application.yml
spring:
output:
ansi:
enabled: always
(...)
# Micrometer tracing
management:
tracing:
sampling:
probability: 1.0
otlp:
tracing:
endpoint: http://localhost:4318/v1/traces
metrics:
export:
url: http://localhost:4318/v1/metrics
endpoints:
web:
exposure:
include: "*"
(...)
logging:
pattern:
console: '[%-5level] %d{yyyy-MM-dd HH:mm:ss.SSS} [%t] %c{1} [%X{traceId}] [%X{spanId}] - %msg%n'
level: '%5p [${spring.application.name:},%X{traceId:-},%X{spanId:-}]'
logback.xml
%black(%d{ISO8601}) %highlight(%-5level) [%blue(%t)] %yellow(%C{1}): trace_id: %X{traceId}
span_id: %X{spanId} %msg%n%throwable
${LOGS}/up-user-service.log
%d %p %C{1} [%t] %m%n
${LOGS}/archived/up-user-service-%d{yyyy-MM-dd}.%i.log
10MB
%d{HH:mm:ss.SSS} [%t] %-5level %logger{36} serviceName: %X{serviceName} requestId: %X{requestId} trace_id: %X{traceId} span_id: %X{spanId} - %msg%n
pom.xml(...)
org.springframework.boot
spring-boot-starter-actuator
io.micrometer
micrometer-tracing
io.micrometer
micrometer-tracing-bridge-otel
io.opentelemetry
opentelemetry-exporter-otlp
io.opentelemetry.instrumentation
opentelemetry-logback-appender-1.0
2.1.0-alpha
runtime
io.opentelemetry
opentelemetry-exporter-otlp-logs
1.26.0-alpha
io.opentelemetry.instrumentation
opentelemetry-logback-1.0
1.9.2-alpha
runtime
(...)
ПРИМЕЧАНИЕ. Мне интересно, связана ли эта проблема, а не связана ли она с отсутствием спандидов и трассировок в некоторых журналах. Ни у кого из них их нет, за исключением, например, случаев, когда я вхожу в пользовательский диапазон. Это пример класса, пробующего различные функции, включая создание интервалов:
TestApi.java
@Slf4j
@RestController
class TestApi {
@Autowired
private ObservationRegistry observationRegistry;
@Autowired
private Tracer tracer;
@Autowired
private MeterRegistry meterRegistry;
@GetMapping("test")
void test() {
System.out.println("### MY TEST ###");
log.info("@@@@@ TEST LOMBOK LOGGER @@@@@");
}
@GetMapping("exception")
void exception() throws Exception {
throw new Exception("CUSTOM EXCEPTION");
}
@GetMapping("custom_span") // WORKS
void customSpan() throws Exception {
Observation observation = Observation.createNotStarted("my-custom-operation", this.observationRegistry);
observation.lowCardinalityKeyValue("my-tag", "my-value");
observation.observe(() -> {
System.out.println("### HOW LONG DID IT TAKE? ###");
log.info("@@@@@ HOW LONG DID IT TAKE? @@@@@");
});
}
// So, what is Baggage? The spec defines a standard HTTP header to propagate the application-defined properties associated with a distributed request.
@GetMapping("custom_baggage")
void customBaggage() {
try (BaggageInScope scope = this.tracer.createBaggageInScope("my-baggage-key", "my-baggage-value")) {
System.out.println("### IS IT BAGGAGING? ###");
log.info("@@@@@ IS IT BAGGAGING? @@@@@");
log.info("Contains the following baggage {}", tracer.getAllBaggage());
}
}
@GetMapping("custom_metric")
void customMetric() { // TODO: TO BE TESTED WITH A COMPATIBLE METRIC UI
log.info("CREATING CUSTOM METRIC");
List list = new ArrayList();
meterRegistry.gauge("list.size", Tags.empty(), list.size());
list.add(1);
list.add(2);
list.add(3);
}
}
config.yaml
receivers:
otlp:
protocols:
grpc:
endpoint: 0.0.0.0:4317
http:
endpoint: 0.0.0.0:4318
processors:
exporters:
logging:
loglevel: debug
jaeger:
endpoint: jaeger-service:14250
tls:
insecure: true
service:
pipelines:
traces:
receivers: [otlp]
exporters: [logging, jaeger]
metrics:
receivers: [otlp]
exporters: [logging]
logs:
receivers: [ otlp ]
exporters: [logging]
Подробнее здесь: https://stackoverflow.com/questions/781 ... elemetry-t
Мобильная версия