SkyWalking 和 Graylog的简单使用

182 阅读6分钟

SkyWalking 和 Graylog 都是开源的监控和日志管理工具,虽然它们解决的具体问题不同,但都可以帮助开发人员和运维团队更好地管理和分析系统数据。下面我分别介绍一下它们:

1. SkyWalking

SkyWalking 是一个开源的 分布式系统追踪、监控和性能分析工具。它主要用于监控微服务架构,帮助开发人员和运维人员了解应用程序的调用链路、性能瓶颈和故障点。

主要特点:

  • 分布式追踪:SkyWalking 可以追踪跨多个微服务的请求,生成完整的调用链路。这对于微服务架构的性能监控和问题排查非常有用。
  • 性能指标收集:SkyWalking 会自动收集应用程序的性能指标,包括响应时间、吞吐量、错误率等。
  • 拓扑图展示:通过调用链和拓扑图的可视化展示,SkyWalking 能够直观地显示微服务之间的交互和依赖关系。
  • 多语言支持:它支持多种语言,包括 Java、C++、Python、Go 等,适用于多语言微服务架构。
  • 可扩展性:可以通过插件进行扩展,支持多种存储后端如 ElasticSearch、H2、MySQL 等。

SkyWalking 非常适合大规模微服务系统中的追踪和性能分析,是一种全栈的分布式链路追踪解决方案。

2. Graylog

Graylog 是一个开源的 日志管理平台,用于集中管理、存储、分析和监控日志数据。它能够帮助开发人员和系统管理员处理大量的系统日志,进行日志分析和排查问题。

主要特点:

  • 集中式日志管理:Graylog 可以从多个来源收集日志,包括服务器、应用程序、容器等,集中管理这些日志数据。
  • 实时日志分析:Graylog 提供实时的日志流处理,用户可以定义规则来识别特定的事件模式(例如错误、警告等)。
  • 强大的搜索能力:Graylog 允许用户使用灵活的查询语言(类似于 ElasticSearch 的语法)对日志数据进行复杂的搜索,快速找到所需的信息。
  • 告警系统:用户可以设置基于日志数据的告警规则,当日志中出现特定模式时触发告警(如通过电子邮件或 webhook)。
  • 可视化:Graylog 提供丰富的可视化功能,用户可以通过仪表盘将日志数据图表化,便于分析和监控。
  • 插件支持:Graylog 支持通过插件进行功能扩展,常见的后端存储系统是 ElasticSearch。

Graylog 更侧重于日志的集中存储、查询、分析和告警,与 ElasticSearch 一起通常组成一套强大的日志管理解决方案。

区别:

  • SkyWalking 主要用于分布式系统中的调用链路跟踪和性能监控。
  • Graylog 则主要用于日志的集中式管理、分析和监控。

两者可以配合使用:SkyWalking 负责追踪和监控系统的性能问题,而 Graylog 负责管理系统产生的日志。通过结合这两者,团队可以更全面地监控和分析应用系统的运行状态。

下面我将提供一个场景案例,展示如何结合 SkyWalking 进行分布式链路追踪,和 Graylog 进行日志管理。这些工具将被应用在一个基于 Spring Boot 的微服务架构中。

场景描述

假设我们有一个电商系统,由多个微服务构成:

  1. 订单服务(Order Service)
  2. 库存服务(Inventory Service)
  3. 用户服务(User Service)

用户通过订单服务下单,订单服务与库存服务进行交互以检查库存。订单服务在操作时会产生日志,Graylog 会负责收集并分析这些日志。SkyWalking 用来追踪请求在不同微服务之间的链路,帮助我们监控整个系统的性能。

框架工具:

  • Spring Boot: 用于构建微服务
  • SkyWalking: 用于分布式链路追踪
  • Graylog: 用于日志收集和管理

1. SkyWalking 集成

首先我们将 SkyWalking 集成到我们的 Spring Boot 微服务中。

步骤:

1.1 添加 SkyWalking Agent 到每个微服务

SkyWalking 通过在服务中嵌入探针(agent)进行链路追踪。每个 Spring Boot 服务都需要加上 SkyWalking Agent。

  1. 下载 SkyWalking Agent:

    wget https://archive.apache.org/dist/skywalking/java-agent/8.8.1/apache-skywalking-java-agent-8.8.1.tgz
    tar -xzf apache-skywalking-java-agent-8.8.1.tgz
    
  2. 启动服务时指定 -javaagent 参数来注入 SkyWalking 代理。例如在启动 Spring Boot 应用时,添加如下 JVM 参数:

    java -javaagent:/path/to/skywalking/agent/skywalking-agent.jar \
         -Dskywalking.agent.service_name=order-service \
         -Dskywalking.collector.backend_service=localhost:11800 \
         -jar order-service.jar
    

    这里,service_name 是当前服务的名称,collector.backend_service 是 SkyWalking 后端服务的地址。

1.2 配置 SkyWalking 后端

  1. 启动 SkyWalking OAP Server 和 UI:

    使用 Docker 启动 SkyWalking OAP 服务和 UI 界面:

    docker run --name oap --restart always -d -p 11800:11800 -p 12800:12800 apache/skywalking-oap-server:8.8.1-es7
    docker run --name ui --restart always -d -p 8080:8080 apache/skywalking-ui:8.8.1
    
  2. 访问 SkyWalking UI 界面:http://localhost:8080/


2. Graylog 集成

我们将 Graylog 集成到日志系统中,用来集中管理微服务日志。

步骤:

2.1 启动 Graylog

使用 Docker 启动 Graylog,并配置它使用 Elasticsearch 作为后端存储:

docker run --name mongodb -d mongo:4.2
docker run --name elasticsearch -d -p 9200:9200 -p 9300:9300 -e "discovery.type=single-node" docker.elastic.co/elasticsearch/elasticsearch:7.10.1
docker run --name graylog -d -p 9000:9000 -p 12201:12201 -e "GRAYLOG_HTTP_EXTERNAL_URI=http://127.0.0.1:9000/" graylog/graylog:4.0

Graylog 的 Web 界面可以通过 http://localhost:9000 访问。

2.2 在 Spring Boot 中添加日志到 Graylog

在每个 Spring Boot 微服务中,我们使用 logback-gelf 将日志发送到 Graylog。

  1. pom.xml 中添加依赖:

    <dependency>
        <groupId>de.siegmar</groupId>
        <artifactId>logback-gelf</artifactId>
        <version>3.0.0</version>
    </dependency>
    
  2. src/main/resources/logback-spring.xml 中配置 Graylog:

    <configuration>
        <appender name="GELF" class="de.siegmar.logbackgelf.GelfTcpAppender">
            <server>localhost</server> <!-- Graylog 地址 -->
            <port>12201</port>          <!-- Graylog 端口 -->
            <facility>order-service</facility> <!-- 当前服务名 -->
            <additionalField>appName:OrderService</additionalField> <!-- 自定义字段 -->
        </appender>
    
        <root level="INFO">
            <appender-ref ref="GELF" />
        </root>
    </configuration>
    

    这里的 serverport 是 Graylog 的地址和端口,facility 指定了当前微服务的名称,appName 是我们添加的自定义字段,用来标识日志来自哪个应用。


3. 实际案例代码

接下来展示简单的 Spring Boot 微服务,利用 SkyWalking 追踪和 Graylog 记录日志。

Order Service 示例代码

OrderController.java

@RestController
@RequestMapping("/orders")
public class OrderController {

    private final Logger logger = LoggerFactory.getLogger(OrderController.class);

    @Autowired
    private InventoryServiceClient inventoryServiceClient;

    @PostMapping
    public ResponseEntity<String> createOrder(@RequestBody OrderRequest orderRequest) {
        logger.info("Received order request: {}", orderRequest);

        // 调用库存服务检查库存
        boolean isAvailable = inventoryServiceClient.checkStock(orderRequest.getProductId());

        if (isAvailable) {
            logger.info("Product available, creating order for product ID: {}", orderRequest.getProductId());
            return ResponseEntity.ok("Order created successfully");
        } else {
            logger.warn("Product not available for product ID: {}", orderRequest.getProductId());
            return ResponseEntity.status(HttpStatus.BAD_REQUEST).body("Product not available");
        }
    }
}

InventoryServiceClient.java

@FeignClient(name = "inventory-service")
public interface InventoryServiceClient {

    @GetMapping("/inventory/check")
    boolean checkStock(@RequestParam("productId") String productId);
}

Inventory Service 示例代码

InventoryController.java

@RestController
@RequestMapping("/inventory")
public class InventoryController {

    private final Logger logger = LoggerFactory.getLogger(InventoryController.class);

    @GetMapping("/check")
    public boolean checkStock(@RequestParam("productId") String productId) {
        logger.info("Checking stock for product ID: {}", productId);
        // 假设库存充足
        return true;
    }
}

4. 运行与验证

  1. 启动 SkyWalking OAP Server 和 UI,配置每个微服务使用 SkyWalking 代理启动。
  2. 启动 Graylog 服务,并确认每个微服务的日志被发送到 Graylog 中。
  3. 启动 order-serviceinventory-service
  4. 访问 SkyWalking UI,查看分布式追踪数据。
  5. 在 Graylog 中,搜索和分析来自 order-serviceinventory-service 的日志。

通过 SkyWalking 你可以看到微服务之间的调用链路,如 OrderController 调用了 InventoryServiceClient。而 Graylog 会展示详细的日志信息,包括日志级别、时间戳、请求内容等,帮助你排查问题。


这种架构非常适合复杂的微服务系统,通过 SkyWalking 的调用链追踪和 Graylog 的日志分析,开发和运维团队可以高效地监控和排查系统问题。