Python 项目微服务链路追踪监控利器:SkyWalking 全景解析与实战应用

92569844684d8a59d2ab2db52b20cbac

image

SkyWalking 是什么?

官方摘要

SkyWalking 是一个开源的 APM 系统,为云原生架构中的分布式系统提供监控、跟踪和诊断功能。

分布式追踪

端到端分布式跟踪。服务拓扑分析、以服务为中心的可观察性和 API 仪表板。

您堆栈的代理

Java、.Net Core、PHP、NodeJS、Golang、LUA、Rust、C++、客户端 JavaScript 和 Python 代理,具有积极的开发和维护能力。

eBPF 早期采用

Rover 代理充当由 eBPF 提供支持的监视器和分析器,用于监视 Kubernetes 部署并诊断 CPU 和网络性能。

缩放

一个 SkyWalking 集群可以收集和分析超过 1000 亿个遥测数据。

支持成熟的遥测生态系统

支持来自成熟生态系统的指标、跟踪和日志,例如 Zipkin、OpenTelemetry、Prometheus、Zabbix、Fluentd

原生 APM 数据库

BanyanDB 是一个可观测性数据库,创建于 2022 年,旨在摄取、分析和存储遥测/可观测数据。

一致的指标聚合

SkyWalking 原生计量格式和众所周知的计量格式(例如 OpenTelemetry、Telegraf、Zabbix)通过相同的脚本管道进行处理。

日志管理管道

通过脚本管道高性能支持日志格式化、提取指标、各种采样策略。

警报和遥测管道

支持以服务为中心、以部署为中心、以 API 为中心的报警规则设置。支持将警报和所有遥测数据转发给第三方。

SkyWalking 介绍

Apache Skywalking 是一款开源的应用程序性能监控工具,旨在帮助开发人员和 DevOps 团队监控分布式应用程序的性能。它可以帮助用户了解应用程序的运行情况,并通过可视化图形和数据报告,提供实时的指标和分析。

Skywalking 支持多种语言和框架,包括 Java、Go、Node.js 和 Python。它使用分布式追踪技术来监控应用程序内部和外部的所有调用,从而获得关于应用程序性能的完整见解。

Skywalking 提供了一系列强大的功能,包括性能监控、故障诊断和调试、数据分析等。它还提供了警报功能,当发生重要的性能问题时,可以向开发人员和 DevOps 团队发送通知。

Skywalking 还具有很好的可扩展性,可以与其他应用程序性能监控工具,如 Grafana 和 Elasticsearch 集成,从而提供更加强大的监控和分析能力。

总之,Apache Skywalking 是一款功能强大且易于使用的应用程序性能监控工具。它可以帮助开发人员和 DevOps 团队更好地了解应用程序的运行情况,并在发生性能问题时及时采取行动。

官网:skywalking.apache.org/

下载:skywalking.apache.org/downloads/

Github:github.com/apache/skyw...

文档:skywalking.apache.org/docs/

中文文档:skyapm.github.io/document-cn...

SkyWalking 在 Python 项目中的使用

SkyWalking Python Agent 支持 Apache SkyWalking 的 Python 代理为 Python 项目提供本机跟踪/指标/日志记录/分析功能。

部署 SkyWalking

部署 SkyWalking 需要三个组件 sky-elasticsearchskywalking-oapskywalking-ui.

采用 docker-compose 部署

yaml 复制代码
version: '3.5'
services:
  sky-elasticsearch:
    image: elasticsearch:6.8.1
    container_name: sky-elasticsearch
    restart: always
    ports:
      - 19200:9200
    environment:
      discovery.type: single-node  #es单机模式
      TZ: Asia/Shanghai  #时区设置
      TAKE_FILE_OWNERSHIP: true  #解决 volumes 挂载权限问题
      ES_JAVA_OPTS: -Xms256m -Xmx256m ##jvm内存分配为256MB
    ulimits:
      memlock:
        soft: -1
        hard: -1
    volumes:
      - ./elasticsearch/data:/usr/share/elasticsearch/data
  oap:
    image: apache/skywalking-oap-server:8.5.0-es6
    container_name: skywalking-oap
    depends_on:
      - sky-elasticsearch
    links:
      - sky-elasticsearch
    restart: always
    ports:
      - 11800:11800
      - 12800:12800
    environment:
      SW_STORAGE: elasticsearch
      SW_STORAGE_ES_CLUSTER_NODES: sky-elasticsearch:9200
      SW_HEALTH_CHECKER: default
      SW_TELEMETRY: prometheus
    healthcheck:
      test: ["CMD", "./bin/swctl", "ch"]
      interval: 30s
      timeout: 10s
      retries: 3
      start_period: 40s
  ui:
    image: apache/skywalking-ui:8.5.0
    container_name: skywalking-ui
    depends_on:
      - oap
    links:
      - oap
    restart: always
    ports:
      - 8888:8080
    environment:
      SW_OAP_ADDRESS: oap:12800

docker-compose up -d启动容器编排即可

docker-compose ps查询容器状态

image

浏览器打开ip:8888 进入skywalking的UI页面

image

下载和安装 python 的 agent

image

python agent 安装文档:skywalking.apache.org/docs/skywal...

注意:SkyWalking Python 代理需要 SkyWalking 8.0+ 和 Python 3.7+

安装方式

PypI 安装

vbnet 复制代码
# Install the latest version, using the default gRPC protocol to report data to OAP
pip install "apache-skywalking"

# Install support for every protocol (gRPC, HTTP, Kafka)
pip install "apache-skywalking[all]"

# Install the latest version, using the http protocol to report data to OAP
pip install "apache-skywalking[http]"

# Install the latest version, using the kafka protocol to report data to OAP
pip install "apache-skywalking[kafka]"

# Install a specific version x.y.z
# pip install apache-skywalking==x.y.z
pip install apache-skywalking==0.1.0  # For example, install version 0.1.0 no matter what the latest version is

Docker 安装

SkyWalking Python 代理提供方便的 dockerfile 和图像,以便利用其自动引导功能轻松集成。

只需根据所需的代理版本、协议和 Python 版本从 Docker Hub 中提取 SkyWalking Python 映像即可。

bash 复制代码
FROM apache/skywalking-python:0.8.0-grpc-py3.10

# ... build your Python application

# If you prefer compact images (built from official Python slim image)

FROM apache/skywalking-python:0.8.0-grpc-py3.10-slim

然后,您可以基于我们启用代理的 Python 映像构建您的 Python 应用程序映像,并在为您启用 SkyWalking 代理的情况下启动您的应用程序。请参阅我们的 容器化指南,了解有关集成和配置的更多说明。

非倾入式安装【推荐】

SkyWalking Python 代理命令行界面 (sw-python CLI) 现在,SkyWalking Python Agent CLI 是使用 Python 代理运行应用程序的推荐方式,该 CLI 经过充分测试并被所有代理 E2E 和插件测试使用。

在 0.7.0 之前的版本中,您至少需要将以下几行添加到您的应用程序中才能连接并运行代理,由于大量服务、DevOps 实践,这在许多情况下可能很乏味,并且在使用时可能会导致问题与预分叉服务器

arduino 复制代码
from skywalking import agent, config
config.init(SomeConfig)
agent.start()

SkyWalking Python 代理实现了一个命令行界面,可用于在部署期间将代理附加到您出色的应用程序,而无需更改任何应用程序代码,就像 SkyWalking Java 代理一样。 特别是有了新的自动 postfork 注入功能,您不再需要担心线程和 fork 不兼容的问题。

查看如何与 uWSGI 一起使用如何与 Gunicorn 一起使用,了解 post_fork 的详细背景、为什么需要它们以及如何轻松克服 sw-pythonCLI 的麻烦。

如果 CLI 不适合您,您仍然应该阅读集成代理的传统方法。sw-python

如何与 uWSGI 一起使用 : skywalking.apache.org/docs/skywal...

如何与 Gunicorn 一起使用skywalking.apache.org/docs/skywal...

使用方法

通过 pip 成功安装 SkyWalking Python 代理 sw-python 后,将在您的环境中安装命令行脚本(首选虚拟环境)。

运行 sw-python 看看它是否可用,您将需要通过环境变量传递配置。

例如:export SW_AGENT_COLLECTOR_BACKEND_SERVICES=localhost:11800

选项 run_

CLI sw-python提供了一个 run 选项,您可以使用它来执行应用程序(以命令开头 python 或以路径上的基于 Python 的程序 gunicorn 开头),就像您正常调用它们一样,加上前缀,以下示例演示了用法。

如果您之前运行 Gunicorn/uwsgi 应用程序的命令是:

gunicorn your_app:app --workers 2 --worker-class uvicorn.workers.UvicornWorker --bind 0.0.0.0:8088

或者

uwsgi --die-on-term --http 0.0.0.0:5000 --http-manage-expect --master --workers 3 --enable-threads --threads 3 --manage-script-name --mount /=main:app

请将其更改为(该-p 选项在每个进程中启动一个代理,这是正确的行为):

重要提示:如果对 uwsgi/gunicorn 的调用以其他命令为前缀,则此方法将失败,因为代理当前将在索引 0 处查找命令行输入以确保安全,作为实验性功能。

sw-python run -p gunicorn your_app:app --workers 2 --worker-class uvicorn.workers.UvicornWorker --bind 0.0.0.0:8088

或者

sw-python run -p uwsgi --die-on-term --http 0.0.0.0:5000 --http-manage-expect --master --workers 3 --enable-threads --threads 3 --manage-script-name --mount /=main:app

SkyWalking Python 代理很快就会与您的所有应用程序工作人员一起启动。

请注意,sw-python 只要是 PYTHONPATH 继承的,也可以使用生成的子进程 (os.exec*/subprocess)。

此外,只要打开了应用程序分叉工作线程,sw-python 启动代理就可以很好地工作。(检测到 gunicorn 时会自动开启)os.forkSW_AGENT_EXPERIMENTAL_FORK_SUPPORT

配置代理

您通常需要提供除默认配置之外的其他配置。

通过环境变量

当前支持的方法是提供环境变量列表中列出和解释的环境变量。

通过 sw-config.toml(待定)

目前仅支持环境变量配置;toml 将实施可选配置。

启用 CLI 调试模式 请注意,CLI 是一项操作 Python 解释器引导行为的功能,可能存在不受支持的情况。

如果遇到意外问题,请通过在命令中添加-d 或--debug 标志来打开调试模式 sw-python,如下所示。

从:sw-python run command

到:sw-python -d run command

附加说明

当使用 执行命令时 sw-python run command,命令的 Python 解释器将拾取 SkyWalking 加载器模块。

将 SkyWalking Agent 附加到其他 Python 安装中的命令并不安全,因为不兼容的 Python 版本和不匹配的 SkyWalking 版本可能会导致问题。因此,任何尝试传递使用不同 Python 解释器/环境的命令都不会启动 SkyWalking Python 代理,即使那里安装了另一个 SkyWalking Python 代理(无论版本如何),并且会强制退出并显示一条指示原因的错误消息。

禁止生成的进程启动新代理

有时,您实际上并不需要代理来监视新进程中的任何内容(当它不是 Web 服务工作者时)。(这里我们指的是由 subprocess 和 os.exec*() 生成的进程,os.fork() 不受此标志控制,但是 experimental_fork_support)

如果您不需要为应用程序子进程加载代理,则可以通过设置环境变量来关闭该行为。

SW_AGENT_SW_PYTHON_BOOTSTRAP_PROPAGATE 到 False

请注意,自动引导程序取决于子进程继承的环境,因此在其前面添加新的 sitecustomize 路径或从中删除加载程序路径 PYTHONPATH 也可能会阻止代理在子进程中加载 ​​。

已知的限制

  1. 对于某些 shell 中涉及双引号的参数,CLI 可能无法正常工作。
  2. CLI 和引导程序标准输出日志在 Windows shell 中可能会变得混乱。

接入 django 项目

新建 django 项目 django-admin startproject sky_django_uwsgi

settings.py

css 复制代码
from sky_script.sky_middleware import *

ALLOWED_HOSTS = ["*"]

新建init_sky文件

ini 复制代码
# my_middleware.py
import os

from skywalking import agent, config


def init_sky():
    agent_instance_name = f'<some_good_name>-child({os.getpid()})'

    config.init(agent_collector_backend_services='*.*.*.*:11800',
                agent_name='sky_django_uwsgi', agent_instance_name=agent_instance_name)

    agent.start()

image

image

image

相关推荐
王二端茶倒水1 小时前
大龄程序员兼职跑外卖第五周之亲身感悟
前端·后端·程序员
夜色呦2 小时前
现代电商解决方案:Spring Boot框架实践
数据库·spring boot·后端
爱敲代码的小冰2 小时前
spring boot 请求
java·spring boot·后端
java小吕布3 小时前
Java中的排序算法:探索与比较
java·后端·算法·排序算法
Goboy4 小时前
工欲善其事,必先利其器;小白入门Hadoop必备过程
后端·程序员
李少兄4 小时前
解决 Spring Boot 中 `Ambiguous mapping. Cannot map ‘xxxController‘ method` 错误
java·spring boot·后端
代码小鑫4 小时前
A031-基于SpringBoot的健身房管理系统设计与实现
java·开发语言·数据库·spring boot·后端
Json____4 小时前
学法减分交管12123模拟练习小程序源码前端和后端和搭建教程
前端·后端·学习·小程序·uni-app·学法减分·驾考题库
monkey_meng5 小时前
【Rust类型驱动开发 Type Driven Development】
开发语言·后端·rust
落落落sss5 小时前
MQ集群
java·服务器·开发语言·后端·elasticsearch·adb·ruby