1
resposta

Serviço API-Cursos não aparece no Jaeger

Fiz o comando conforme passado na aula, não sei se hoje alguma atualização desde que foi gravado, inclusive precisei fazer umas alterações no comando visto que o comando passado na aula, apresentou um erro e não subia a aplicação, segue abaixo as informações:

Comando que executei para aplicação subir:
java --add-opens java.base/java.lang=ALL-UNNAMED -javaagent:opentelemetry/opentelemetry-javaagent.jar -Dotel.service.name=api-cursos -Dotel.traces.exporter=otlp -Dotel.metrics.exporter=none -Dotel.integration.jdbc.datasource.enabled=true -Dotel.instrumentation.jdbc.datasource.enabled=true -Dotel.exporter.otlp.endpoint=http://localhost:4318 -Dotel.exporter.otlp.protocol=http/protobuf -jar target/*.jar

Erro que deu no comando passado na aula:
Caused by: java.lang.reflect.InaccessibleObjectException: Unable to make protected final java.lang.Class java.lang.ClassLoader.findLoadedClass(java.lang.String) accessible

Erro no conteiners do collector:
2025/10/31 14:27:28 collector server run finished with error: failed to get config: cannot unmarshal the configuration: 1 error(s) decoding:

  • error decoding 'receivers': error reading configuration for "otlp": 1 error(s) decoding:
  • 'protocols.grpc' has invalid keys: http

Foi corrigido com o seguinte ajuste no arquivo otel-collector-config.yaml:
receivers:
otlp:
protocols:
grpc:
http:
exporters:
otlp/jaeger:
endpoint: jaeger-api-cursos:4317
tls:
insecure: true
service:
pipelines:
traces:
receivers: [otlp]
exporters: [otlp/jaeger]

Insira aqui a descrição dessa imagem para ajudar na acessibilidade

Matricule-se agora e aproveite até 50% OFF

O maior desconto do ano para você evoluir com a maior escola de tecnologia

QUERO APROVEITAR
1 resposta

Olá Robson.
Segue ai e veja se o conteudo abaixo pode lhe ajudar.
Pela imagem e pelas informações que você compartilhou, dá pra ver que o Jaeger UI está rodando normalmente (em localhost:16686) e que o serviço jaeger-query está sendo reconhecido.

Dica de verificação

Para garantir que o api-cursos está exportando traces corretamente:

  1. Acesse o Jaeger UI → Search
  2. No campo Service, veja se aparece api-cursos
  3. Caso não apareça:
    • Verifique se o endpoint OTLP do agent está correto:
      -Dotel.exporter.otlp.endpoint=http://localhost:4318
      
    • Confira se o OpenTelemetry Collector está realmente escutando na porta 4318 (HTTP):
      netstat -tulnp | grep 4318
      

Se o serviço api-cursos não aparece no Jaeger, significa que os traces não estão chegando ao Collector (ou não estão sendo exportados corretamente).
Execute o comando para iniciar o serviço e veja se aparece “Starting OpenTelemetry Java Agent” no log:

java --add-opens java.base/java.lang=ALL-UNNAMED \
  -javaagent:opentelemetry/opentelemetry-javaagent.jar \
  -Dotel.service.name=api-cursos \
  -Dotel.traces.exporter=otlp \
  -Dotel.metrics.exporter=none \
  -Dotel.integration.jdbc.datasource.enabled=true \
  -Dotel.instrumentation.jdbc.datasource.enabled=true \
  -Dotel.exporter.otlp.endpoint=http://localhost:4318 \
  -Dotel.exporter.otlp.protocol=http/protobuf \
  -jar target/*.jar

Se não aparecer nada com “OpenTelemetry” nos logs, o agente não está sendo carregado -> o caminho opentelemetry/opentelemetry-javaagent.jar pode estar errado.
Teste assim:

java -javaagent:./opentelemetry-javaagent.jar -version

Se isso não mostrar nenhum erro, o caminho está certo.
Dentro do container do collector, rode:

netstat -tulnp | grep 4318

Se não aparecer nada, o receiver HTTP não está ativo.
Garanta que o seu otel-collector-config.yaml tenha este trecho exato:

receivers:
  otlp:
    protocols:
      grpc:
      http:

exporters:
  otlp/jaeger:
    endpoint: jaeger:4317
    tls:
      insecure: true

service:
  pipelines:
    traces:
      receivers: [otlp]
      exporters: [otlp/jaeger]

E reinicie o collector:

docker compose restart otel-collector

Execute no host:

curl -v http://localhost:4318/v1/traces

Se o retorno for HTTP/404, está certo (significa que o Collector está ouvindo).
Se der connection refused, a porta não está mapeada no docker-compose.
Exemplo correto no docker-compose.yml:

  otel-collector:
    image: otel/opentelemetry-collector:latest
    command: ["--config=/etc/otel-collector-config.yaml"]
    volumes:
      - ./otel-collector-config.yaml:/etc/otel-collector-config.yaml
    ports:
      - "4317:4317"
      - "4318:4318"

No seu comando Java, o serviço é definido assim:

-Dotel.service.name=api-cursos

Se estiver diferente (ex: API-Cursos, apicursos, etc.), o Jaeger mostrará com outro nome.
O campo é case-sensitive.
Faça uma requisição à sua API (ex: curl http://localhost:8080/algum-endpoint)
-> Isso deve gerar spans.
Depois, no Jaeger UI → Search -> Service, veja se api-cursos aparece.
Pode levar até 10 segundos.
Se ainda não aparecer ative o debug de exportação no agente Java:

-Dotel.javaagent.debug=true

Isso mostrará no log se o agente está tentando enviar spans e para onde.
Analisa o conteudo ai e faça os testes e as modificações necessarias.
Aguardo seu feedback.
Bons estudos.