第七章 ELK Stack高级应用与集成

发布于:2025-09-13 ⋅ 阅读:(16) ⋅ 点赞:(0)

目录

微服务架构集成

1. 微服务日志聚合架构

ELK Stack
消息队列
日志收集层
微服务集群
Logstash Cluster
Elasticsearch Cluster
Kibana
Kafka/RabbitMQ
Filebeat Agent
Metricbeat Agent
APM Agent
User Service
API Gateway
Order Service
Payment Service
Notification Service
User DB
Order DB
Payment DB

2. 分布式追踪集成

Jaeger集成配置:

# docker-compose.yml
version: '3.8'
services:
  jaeger:
    image: jaegertracing/all-in-one:latest
    ports:
      - "16686:16686"
      - "14268:14268"
    environment:
      - COLLECTOR_OTLP_ENABLED=true
      - SPAN_STORAGE_TYPE=elasticsearch
      - ES_SERVER_URLS=http://elasticsearch:9200
    depends_on:
      - elasticsearch

  elasticsearch:
    image: docker.elastic.co/elasticsearch/elasticsearch:8.11.0
    environment:
      - discovery.type=single-node
      - xpack.security.enabled=false
    ports:
      - "9200:9200"

  kibana:
    image: docker.elastic.co/kibana/kibana:8.11.0
    ports:
      - "5601:5601"
    environment:
      - ELASTICSEARCH_HOSTS=http://elasticsearch:9200
    depends_on:
      - elasticsearch

  logstash:
    image: docker.elastic.co/logstash/logstash:8.11.0
    volumes:
      - ./logstash/pipeline:/usr/share/logstash/pipeline
      - ./logstash/config:/usr/share/logstash/config
    ports:
      - "5044:5044"
    depends_on:
      - elasticsearch

Spring Boot微服务集成:

// pom.xml
<dependencies>
    <dependency>
        <groupId>io.opentelemetry</groupId>
        <artifactId>opentelemetry-api</artifactId>
    </dependency>
    <dependency>
        <groupId>io.opentelemetry</groupId>
        <artifactId>opentelemetry-exporter-jaeger</artifactId>
    </dependency>
    <dependency>
        <groupId>net.logstash.logback</groupId>
        <artifactId>logstash-logback-encoder</artifactId>
        <version>7.4</version>
    </dependency>
</dependencies>

// TracingConfiguration.java
@Configuration
public class TracingConfiguration {
   
   
    
    @Bean
    public OpenTelemetry openTelemetry() {
   
   
        return OpenTelemetrySdk.builder()
            .setTracerProvider(
                SdkTracerProvider.builder()
                    .addSpanProcessor(BatchSpanProcessor.builder(
                        JaegerGrpcSpanExporter.builder()
                            .setEndpoint("http://jaeger:14250")
                            .build())
                        .build())
                    .setResource(Resource.getDefault()
                        .merge(Resource.create(
                            Attributes.of(ResourceAttributes.SERVICE_NAME, "user-service"))))
                    .build())
            .build();
    }
}

// UserController.java
@RestController
@RequestMapping("/api/users")
public class UserController {
   
   
    
    private static final Logger logger = LoggerFactory.getLogger(UserController.class);
    private final Tracer tracer;
    
    public UserController(OpenTelemetry openTelemetry) {
   
   
        this.tracer = openTelemetry.getTracer("user-service");
    }
    
    @GetMapping("/{id}")
    public ResponseEntity<User> getUser(@PathVariable Long id) {
   
   
        Span span = tracer.spanBuilder("get-user")
            .setAttribute("user.id", id)
            .startSpan();
        
        try (Scope scope = span.makeCurrent()) {
   
   
            logger.info("Getting user with id: {}", id);
            
            // 业务逻辑
            User user = userService.findById(id);
            
            span.setStatus(StatusCode.OK);
            return ResponseEntity.ok(user);
            
        } catch (Exception e) {
   
   
            span.setStatus(StatusCode.ERROR, e.getMessage());
            logger.error("Error getting user: {}", e.getMessage(), e);
            throw e;
        } finally {
   
   
            span.end();
        }
    }
}

Logback配置:

<!-- logback-spring.xml -->
<configuration>
    <include resource="org/springframework/boot/logging/logback/defaults.xml"/>
    
    <springProfile name="!local">
        <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
            <encoder class="net.logstash.logback.encoder.LoggingEventCompositeJsonEncoder">
                <providers>
                    <timestamp/>
                    <logLevel/>
                    <loggerName/>
                    <message/>
                    <mdc/>
                    <arguments/>
                    <stackTrace/>
                    <pattern>
                        <pattern>
                            {
                                "service": "user-service",
                                "version": "${app.version:-unknown}",
                                "environment": "${spring.profiles.active:-unknown}",
                                "trace_id": "%X{traceId:-}",
                                "span_id": "%X{spanId:-}"
                            }
                        </pattern>
                    </pattern>
                </providers>
            </encoder>
        </appender>
    </springProfile>
    
    <springProfile name="local">
        <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
            <encoder>
                <pattern>%d{HH:mm:ss.SSS} [%thread] %-5level [%X{traceId:-},%X{spanId:-}] %logger{36} - %msg%n</pattern>
            </encoder>
        </appender>
    </springProfile>
    
    <root level="INFO">
        <appender-ref ref="STDOUT"/>
    </root>
</configuration>

3. 服务网格集成

Istio + ELK集成:

# istio-telemetry.yaml
apiVersion: telemetry.istio.io/v1alpha1
kind

网站公告

今日签到

点亮在社区的每一天
去签到