快速高效监控Django的链路追踪之ddtrace

本文介绍django的链路数据收集,踩了一些坑,现在分享一下接入过程。

注册观测云账号

先注册一个账号, 注册地址

注册流程很简单,按照提示点点点就完事了

安装采集器Datakit

登录观测云页面,选择「集成」 - 「DataKit」,选择适合自己环境的安装指令,复制。 我这里是linux环境,其他小伙伴可以按照提示选择对应的安装脚本。

1 复制安装指令

2 在服务器上安装 DataKit

shell 复制代码
DK_DATAWAY="https://openway.guance.com?token=**************" bash -c "$(curl -L https://static.guance.com/datakit/install.sh)"

安装完成,服务会自动启动,程序默认安装在/usr/local/datakit/

3 查询 DataKit 状态

执行命令 systemctl status datakit

4 查看数据

Datakit 安装好后,默认会采集一些数据,可在 「观测云」 - 「基础设施」 - 「主机」查看相关数据

APM接入

1 修改 inputs

在 DataKit 中修改 APM(ddtrace)的 inputs

默认不需要修改 jvm 的 inputs,仅需复制生成 conf 文件即可

shell 复制代码
$ cd /usr/local/datakit/conf.d/ddtrace/
$ cp ddtrace.conf.sample ddtrace.conf
$ vim ddtrace.conf
# 默认不需要修改

2 修改 Django 应用启动方式

前置条件

shell 复制代码
pip install ddtrace

使用ddtrace-run方式启动

settings.py中配置

shell 复制代码
import ddtrace

# 设置datakit接收链路数据ip地址与端口
ddtrace.tracer.configure(
    hostname='127.0.0.1',
    port='9529'
)



os.environ['DD_SERVICE'] = 'DJANGO_TEST'   # 设置服务名
os.environ['DD_TAGS'] = 'project:django_test,env:test,version:v1'   # 设置环境名 设置版本号
os.environ['DD_LOGS_INJECTION'] = 'true'   # 开启log注入


LOGGING = {
    'version': 1,
    'disable_existing_loggers': False,
    'formatters': {
        'simple': {
            'format': '%(asctime)s - %(name)s - %(levelname)s - %(dd.service)s - %(dd.trace_id)s - %(dd.span_id)s - %(message)s'
        },
        'verbose': {
            # '()': DDTraceLoggingFormatter,
            # 'format': '{levelname} {asctime} {module} {process:d} {thread:d} {message}',
            # 'style': '{',
            'format': '%(asctime)s - %(name)s - %(levelname)s - TraceID:%(trace_id)s - SpanID:%(span_id)s - Service:%(service)s - %(message)s'
        },
    },
    'handlers': {
        'console': {
            'class': 'logging.StreamHandler',
            'formatter': 'simple',  # 使用自定义的日志格式化程序
        },
        'file': {
            'level': 'DEBUG',  # 设置日志级别
            'class': 'logging.FileHandler',  # 使用 FileHandler 处理器
            'filename': 'myapp.log',  # 日志文件名
            'formatter': 'simple',  # 使用自定义的日志格式化程序
        },
    },
    'loggers': {
        'django': {
            'handlers': ['console','file'],
            'level': 'INFO',  # 设置日志级别,可以根据需求调整
            'propagate': False,
        },
    },
}

ddtrace 相关环境变量(启动参数)说明:

  • DD_ENV: 为服务设置环境变量。
  • DD_VERSION: APP 版本号。
  • DD_SERVICE: 用于设置应用程序的服务名称,在为 Pylons、Flask 或 Django 等 Web 框架集成设置中间件时,会传递该值。 对于没有 Web 集成的 Tracing,建议您在代码中设置服务名称。
  • DD_SERVICE_MAPPING: 定义服务名映射用于在 Tracing 里重命名服务。
  • DD_TAGS: 为每个 Span 添加默认 Tags,格式为 key:val,key:val
  • DD_AGENT_HOST: Datakit 监听的地址名,默认 localhost。
  • DD_AGENT_PORT: Datakit 监听的端口号,默认 9529。
  • DD_TRACE_SAMPLE_RATE: 设置采样率从 0.0(0%) ~ 1.0(100%)。

view.py中配置

python 复制代码
from django.shortcuts import render,HttpResponse
from django.http import JsonResponse

# Create your views here.
from app01.utils.logger import log


def Test(request):
    log.info('hello world')
    return render(request,'index.html')
def Getuser(request):
    data = {"message": "zhangsan"}
    log.info('get user')
    return JsonResponse(data)

url.py中配置

shell 复制代码
from django.contrib import admin
from django.urls import path

from app01 import views

urlpatterns = [
    path('admin/', admin.site.urls),
    path('test/', views.Test),
    path('get_user/', views.Getuser),
]

通过如下命令开启 Python 应用:

shell 复制代码
ddtrace-run python manage.py runserver 0.0.0.0:8082 

原方式启动 Django 程序

settings.py中配置

python 复制代码
import ddtrace

# 设置datakit接收链路数据ip地址与端口
ddtrace.tracer.configure(
    hostname='127.0.0.1',
    port='9529'
)



os.environ['DD_SERVICE'] = 'DJANGO_TEST'   # 设置服务名
os.environ['DD_TAGS'] = 'project:django_test,env:test,version:v1'   # 设置环境名 设置版本号
os.environ['DD_LOGS_INJECTION'] = 'true'   # 开启log注入
ddtrace.patch_all(logging=True)


LOGGING = {
    'version': 1,
    'disable_existing_loggers': False,
    'formatters': {
        'simple': {
            'format': '%(asctime)s - %(name)s - %(levelname)s - %(dd.service)s - %(dd.trace_id)s - %(dd.span_id)s - %(message)s'
        },
    },
    'handlers': {
        'console': {
            'level': 'INFO',  
            'class': 'logging.StreamHandler',  
            'formatter': 'verbose',
        },
    },
    'loggers': {
        'django': {
            'handlers': ['console'],
            'level': 'INFO',  # 设置日志级别,可以根据需求调整
            'propagate': False,
        },
    },
}

view.py中配置

python 复制代码
from django.shortcuts import render,HttpResponse
from django.http import JsonResponse

# Create your views here.
from app01.utils.logger import log


def Test(request):
    log.info('hello world')
    return render(request,'index.html')
def Getuser(request):
    data = {"message": "zhangsan"}
    log.info('get user')
    return JsonResponse(data)

url.py中配置

javascript 复制代码
from django.contrib import admin
from django.urls import path

from app01 import views

urlpatterns = [
    path('admin/', admin.site.urls),
    path('test/', views.Test),
    path('get_user/', views.Getuser),
]

通过如下命令开启 Python 应用:

复制代码
python manage.py runserver 0.0.0.0:8082 

用gunicorn 方式启动 Django****

首先,确保您已经安装了 Gunicorn。您可以使用以下命令通过 pip 安装:

复制代码
pip install gunicorn

使用 Gunicorn 启动 Django 应用程序,执行以下命令:

复制代码
gunicorn myproject.wsgi:application

完整的启动命令是:

ini 复制代码
# 因为使用了gunicorn,在setting.py中使用os注入的环境变量读取不到,需要使用下面这种方式
DD_SERVICE=DJANGO_TEST \
DD_TAGS=project:django_test,env:test,version:v1 \
DD_AGENT_HOST=127.0.0.1  \
DD_AGENT_PORT=9529 \
DD_LOGS_INJECTION=true \
ddtrace-run gunicorn --workers 4 --bind 0.0.0.0:8082 ddtrace_test.wsgi:application

3 查看 APM 数据

APM 是观测云默认内置的模块,无需创建场景或视图即可进行查看。

视图示例: 通过该视图即可快速查看应用调用情况、拓扑图、异常数据等其他 APM 相关数据

调用链路的问题追踪: 可以排查接口、数据库等问题

同时支持火焰图、span列表、调用关系多种形式查看,非常nice,如果开启了profiling,还能到代码函数级别的查看。

相关推荐
龙腾AI白云1 天前
多模大模型应用实战:智能问答系统开发
python·机器学习·数据分析·django·tornado
程序媛徐师姐1 天前
Python基于OpenCV的马赛克画的设计与实现【附源码、文档说明】
python·opencv·django·马赛克绘画·python马赛克绘画系统·马赛克画·python马赛克画
斯班奇的好朋友阿法法1 天前
Django 项目打包部署完整指南(适配你的项目,零报错)
python·django·sqlite
斯班奇的好朋友阿法法1 天前
Django 3.2 项目:从 Hello World 开始(完整功能版)
python·django
源码之屋2 天前
计算机毕业设计:Python天气数据采集与可视化分析平台 Django框架 线性回归 数据分析 大数据 机器学习 大模型 气象数据(建议收藏)✅
人工智能·python·深度学习·算法·django·线性回归·课程设计
架构师老Y2 天前
003、Python Web框架深度对比:Django vs Flask vs FastAPI
前端·python·django
暴力袋鼠哥3 天前
基于 Django 与 Vue 的汽车数据分析系统设计与实现
vue.js·django·汽车
360智汇云3 天前
PostgreSQL 全文检索深度指南:内置 FTS、zhparser 与 pg_search 全解
postgresql·django·全文检索
leo_messi944 天前
2026版商城项目(三)-- ES+认证服务
后端·python·django
毕胜客源码4 天前
改进yolov8的香蕉成熟度检测系统,改进前后的模型指标对比,有技术文档,支持图像、视频和摄像实时检测
人工智能·python·深度学习·yolo·django