Docker-Compose 应用可观测性最佳实践

前言

在现代软件开发中,容器化技术已经成为一种趋势,它为应用的部署、扩展和管理提供了极大的便利。Docker 是容器化技术的代表,而 Docker Compose 则是 Docker 官方提供的一个工具,用于定义和运行多容器 Docker 应用程序。

Docker Compose 通过一个 YAML 文件来配置应用程序的服务,然后使用一个简单的命令就可以创建并启动所有服务。它非常适合开发、测试和生产环境,因为它可以轻松地将应用程序的多个部分组合成一个可执行的容器化应用程序。

目标

采集 Docker-Compose 应用的 Trace、Log、Metrics 数据,以实现对应用的可观测。

准备工作

安装 DataKit

# 需要把token 改成观测云空间的实际token值(可在「观测云控制台」-「集成」-「Datakit」 上面获取)
DK_DATAWAY="https://openway.guance.com?token=tkn_xxxxxx" bash -c "$(curl -L https://static.guance.com/datakit/install.sh)" 

# 修改配置文件
cd /usr/local/datakit/conf.d/ddtrace && cp ddtrace.conf.sample ddtrace.conf

# 修改datakit.conf文件http_api的listen中改成0.0.0.0:9529
cd /usr/local/datakit/conf.d && vim datakit.conf

# 重启dk
datakit service -R

datakit monitor 命令查看 ddtrace 采集器开启情况。

操作步骤

链路采集

本示例采用 ddtrace 采集 JAVA 应用的链路数据
下载 APM 探针:https://static.guance.com/dd-image/dd-java-agent.jar

1. 两种方式接入 Docker Compose 应用的 APM 数据

  • 将 dd-java-agent.jar 打入业务镜像(缺点:侵入性强)
  • 将 dd-java-agent.jar 通过数据卷挂载的方式进行(本文档采用该方案)

2. 编写 Dockerfile

假设业务可执行 jar 为 log_project-1.0.jar,其中 Dockerfile 中的 ENTRYPOINT 启动参数加载环境变量 JAVA_OPTS;

# log_project_dockerfile文件内容如下
FROM openjdk:8u292
RUN /bin/cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
RUN echo 'Asia/Shanghai' >/etc/timezone
ENV jar log_project-1.0.jar
ENV workdir /data/app/
RUN mkdir -p ${workdir}
COPY ${jar} ${workdir}
WORKDIR ${workdir}
ENTRYPOINT ["sh", "-ec", "exec java ${JAVA_OPTS} -jar ${jar}"]

3. 构建镜像并推送镜像仓库

docker build -t log_project2_nodb:1.0 -f log_project_dockerfile .
docker tag log_project2_nodb:1.0 harbor.xzccloud.local/logproject/log_project2_nodb:1.0
docker push harbor.xzccloud.local/logproject/log_project2_nodb:1.0

4. 编写 docker-compose.yml

下载 dd-java-agent.jar 到宿主机的 /usr/local/ddtrace/ 目录下,可以按照以下步骤修改 docker-compose.yml 文件。

  • 在 docker-compose.yaml 文件中添加卷挂载,将宿主机上的 dd-java-agent.jar 挂载至容器中。
  • 添加 JAVA_OPTS环境变量,Ddd.agent.host 的地址可以设置为 docker0 网卡地址,可根据实际情况修改。
version: '3'
services:
  logproject2:
    image: harbor.xzccloud.local/logproject/log_project2_nodb:1.0
    container_name: log_project2
    privileged: true
    ports: 
      - "8080:8080"
    environment:
      - TZ=Asia/Shanghai
      - JAVA_OPTS=-javaagent:/usr/local/ddtrace/dd-java-agent.jar -Ddd.logs.injection=true -Ddd.service.name=logproject2 -Ddd.env=dev -Ddd.version=2.0 -Ddd.agent.host=172.17.0.1 -Ddd.trace.agent.port=9529
    volumes:
      - /usr/local/ddtrace/:/usr/local/ddtrace
    networks:
      - persist
networks:
    persist:
        external:
            name: mynetwork

Tips:
新建桥接网络:docker network create --driver bridge mynetwork

5. 启动应用

docker-compose –f docker-compose.yml up –d
# 调试时可以前台运行应用:
docker-compose -f docker-compose.yml up

6. 验证效果

登录「观测云」-「应用性能监测」,查看链路数据上报情况。

日志采集

应用日志分为 stdout 日志和容器内日志,下面根据两种不同的情况进行说明。

为了区分两种不同的日志,本示例控制台输出日志中会包含“控制台日志输出”字样,容器内文件日志中会包含“文件内日志输出”字样。

1. stdout 日志采集

1.1 前提条件

docker-compose 应用启动之后,确认 stdout 日志正常输出;

docker logs -f log_project2

1.2 开启采集器

开启 container 采集器(默认开启),根据需要修改配置即可,本示例根据 image 来筛选采集容器 stdout 日志。

# 手动开启container采集器
cd /usr/local/datakit/conf.d/container && cp container.conf.sample container.conf
datakit service -R

假设,我只想采集镜像为 harbor.xzccloud.local/logproject/log_project2_nodb:1.0 和 harbor.xzccloud.local/logproject/nginx:1.20.1 对应容器日志,container.conf 配置摘要如下(其他配置默认即可):

                .
                .
                .
  ## Containers logs to include and exclude, default collect all containers. Globs accepted.
  container_include_log = ["image:*log_project2_nodb*","image:*nginx*"]
  container_exclude_log = []
                .
                .
                .

1.3 验证效果

登录观测云->日志,查看 stdout 日志正常上报。

2. 容器内日志采集

2.1 前提条件

docker-compose 应用启动之后,确认容器内日志正常输出(本示例容器内日志目录:/tmp/log);

修改链路采集中的 docker-compose.yml 文件,将宿主机的 /tmp/logx 挂载到容器的日志目录 /tmp/log 。

version: '3'
services:
  logproject2:
    image: harbor.xzccloud.local/logproject/log_project2_nodb:1.0
    container_name: log_project2
    privileged: true
    ports: 
      - "8080:8080"
    environment:
      - TZ=Asia/Shanghai
      - JAVA_OPTS=-javaagent:/usr/local/ddtrace/dd-java-agent.jar -Ddd.logs.injection=true -Ddd.service.name=logproject2 -Ddd.env=dev -Ddd.version=2.0 -Ddd.agent.host=172.17.0.1 -Ddd.trace.agent.port=9529
    volumes:
      - /usr/local/ddtrace/:/usr/local/ddtrace
      - /tmp/logx:/tmp/log
    networks:
      - persist
networks:
    persist:
        external:
            name: mynetwork
  • 应用启动之后,确认/tmp/logx下有输出对应的日志文件;

2.2 开启采集器

开启 log 采集器。

cd /usr/local/datakit/conf.d/log && cp logging.conf.sample log_project.conf
# 修改log_project.conf配置文件
vim log_project.conf
                    .
                    .
                    .
  ## File names or a pattern to tail.
  logfiles = [
    "/tmp/logx/log-*.log",
  ]

  # Only two protocols are supported:TCP and UDP.
  # sockets = [
  #         "tcp://0.0.0.0:9530",
  #         "udp://0.0.0.0:9531",
  # ]
  ## glob filteer
  ignore = [""]

  ## Your logging source, if it's empty, use 'default'.
  source = "log_project2_file"

  ## Add service tag, if it's empty, use $source.
  service = "log_project2_file"               
                    .
                    .
                    .
# 重启dk
datakit service -R           

2.3 验证效果

登录观测云->日志,查看容器内日志正常上报。

指标采集

1. 开启采集器

开启 container 采集器(默认已开启),无需变动。

2. 验证效果

登录观测云->场景->新建仪表板,新建 dashboard(Docker 监控视图),即可查看对应指标。

登录观测云->指标->指标管理,采集容器所有指标列表如下。

总结

使用 Docker Compose 部署 Java 应用并集成可观测性工具,可以简化部署流程,提高系统的可监控性和可维护性。通过本文的实践,你可以快速上手并应用于实际项目中。

微软开源基于 Rust 的 OpenHCL 字节跳动商业化团队模型训练被“投毒”,内部人士称未影响豆包大模型 华为正式发布原生鸿蒙系统 OpenJDK 新提案:将 JDK 大小减少约 25% Node.js 23 正式发布,不再支持 32 位 Windows 系统 Linux 大规模移除疑似俄开发者,开源药丸? QUIC 在高速网络下不够快 RustDesk 远程桌面 Web 客户端 V2 预览 前端开发框架 Svelte 5 发布,历史上最重要的版本 开源日报 | 北大实习生攻击字节AI训练集群;Bitwarden进一步脱离开源;新一代MoE架构;给手机装Linux;英伟达真正的护城河是什么?
{{o.name}}
{{m.name}}

猜你喜欢

转载自my.oschina.net/u/7096329/blog/16273714