Spring Boot微服务日志无法推送至Grafana Loki求助
无法在Grafana Loki面板查看Spring Boot微服务日志(基于Grafana Stack+OpenTelemetry)
我正在为Spring Boot微服务搭建基于Grafana Stack的可观测性体系,但目前无法在Grafana的Loki面板中查看服务日志。我怀疑问题出在docker-compose.yml、otel-collector.yml或OpenTelemetryConfig.java这几个配置文件中,以下是关键代码片段:
otel-collector.yml 关键配置
receivers: otlp: protocols: grpc: endpoint: 0.0.0.0:4317 http: endpoint: 0.0.0.0:4318 jaeger: protocols: grpc: endpoint: 0.0.0.0:14250 thrift_http: endpoint: 0.0.0.0:14268 prometheus: config: scrape_configs: - job_name: 'otel-collector' scrape_interval: 10s static_configs: - targets: ['0.0.0.0:8888'] processors: batch: exporters: prometheus: endpoint: "prometheus:9090" logging: loglevel: debug otlp: endpoint: tempo:4317 tls: insecure: true loki: endpoint: "loki:3100/loki/api/v1/push" tls: insecure: true service: pipelines: traces: receivers: [otlp, jaeger] processors: [batch] exporters: [logging, otlp] metrics: receivers: [otlp, prometheus] processors: [batch] exporters: [logging, prometheus] logs: receivers: [otlp] processors: [batch] exporters: [logging, loki]
docker-compose.yml 关键配置
services: otel-collector: image: otel/opentelemetry-collector-contrib:0.86.0 command: ["--config=/etc/otel-collector.yml"] volumes: - ./docker/collector/otel-collector.yml:/etc/otel-collector.yml ports: - "4317:4317" # OTLP gRPC receiver - "4318:4318" # OTLP HTTP receiver - "14250:14250" # Jaeger gRPC - "14268:14268" # Jaeger thrift HTTP - "8888:8888" # Prometheus metrics exposed by the collector depends_on: - prometheus - tempo - loki loki: image: grafana/loki:2.9.2 ports: - "3100:3100" command: -config.file=/etc/loki/local-config.yaml volumes: - ./docker/loki/loki-config.yml:/etc/loki/local-config.yaml grafana: image: grafana/grafana:10.1.0 ports: - "3000:3000" volumes: - ./docker/grafana/provisioning:/etc/grafana/provisioning - grafana_data:/var/lib/grafana environment: - GF_SECURITY_ADMIN_PASSWORD=admin depends_on: - prometheus - loki - tempo
OpenTelemetryConfig.java 完整代码
package com.tournament.config.common; import io.opentelemetry.api.OpenTelemetry; import io.opentelemetry.api.trace.Tracer; import io.opentelemetry.exporter.otlp.logs.OtlpGrpcLogRecordExporter; import io.opentelemetry.exporter.otlp.trace.OtlpGrpcSpanExporter; import io.opentelemetry.sdk.OpenTelemetrySdk; import io.opentelemetry.sdk.logs.LogRecordProcessor; import io.opentelemetry.sdk.logs.SdkLoggerProvider; import io.opentelemetry.sdk.logs.export.BatchLogRecordProcessor; import io.opentelemetry.sdk.resources.Resource; import io.opentelemetry.sdk.trace.SdkTracerProvider; import io.opentelemetry.sdk.trace.export.BatchSpanProcessor; import io.opentelemetry.semconv.resource.attributes.ResourceAttributes; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; @Configuration public class OpenTelemetryConfig { @Bean public OpenTelemetry openTelemetry() { Resource resource = Resource.getDefault() .merge(Resource.create(ResourceAttributes.SERVICE_NAME.of("tourni-identity-service"))); // Trace exporter OtlpGrpcSpanExporter spanExporter = OtlpGrpcSpanExporter.builder() .setEndpoint("http://localhost:4317") .build(); // Log exporter OtlpGrpcLogRecordExporter logExporter = OtlpGrpcLogRecordExporter.builder() .setEndpoint("http://localhost:4317") .build(); SdkTracerProvider tracerProvider = SdkTracerProvider.builder() .addSpanProcessor(BatchSpanProcessor.builder(spanExporter).build()) .setResource(resource) .build(); LogRecordProcessor logRecordProcessor = BatchLogRecordProcessor.builder(logExporter).build(); SdkLoggerProvider loggerProvider = SdkLoggerProvider.builder() .addLogRecordProcessor(logRecordProcessor) .setResource(resource) .build(); OpenTelemetrySdk openTelemetry = OpenTelemetrySdk.builder() .setTracerProvider(tracerProvider) .setLoggerProvider(loggerProvider) .build(); Runtime.getRuntime().addShutdownHook(new Thread(() -> { tracerProvider.shutdown(); loggerProvider.shutdown(); })); return openTelemetry; } @Bean public Tracer tracer(OpenTelemetry openTelemetry) { return openTelemetry.getTracer("tourni-identity-service"); } }
我参考了Spring Boot整合OpenTelemetry+Prometheus+Grafana+Tempo的相关文章进行配置,但一直卡在日志无法导入Loki的问题上,恳请帮忙排查可能的配置错误。
内容的提问来源于stack exchange,提问作者Raju
相关产品推荐
相关产品推荐

