快速高效监控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,还能到代码函数级别的查看。

相关推荐
倔强青铜三1 天前
Django 6.0来袭!这些新特性,真的令人振奋!
人工智能·python·django
Java水解2 天前
Django实现接口token检测的实现方案
后端·django
飞Link2 天前
【Django】Django 调用外部 Python 程序的完整指南
后端·python·django·sqlite
码界奇点2 天前
基于Django与Vue.js的RBAC权限管理系统设计与实现
vue.js·python·车载系统·django·毕业设计·源代码管理
计算机学姐3 天前
基于Python的智能点餐系统【2026最新】
开发语言·vue.js·后端·python·mysql·django·flask
计算机学姐3 天前
基于Python的在线考试系统【2026最新】
开发语言·vue.js·后端·python·mysql·django·flask
码界奇点3 天前
基于Django REST framework与Vue的前后端分离后台管理系统设计与实现
vue.js·后端·python·django·毕业设计·源代码管理
Q_Q5110082853 天前
python+springboot+django/flask基于深度学习的音乐推荐系统
spring boot·python·django·flask·node.js·php
Q_Q5110082853 天前
python+springboot+django/flask基于深度学习的淘宝用户购物可视化与行为预测系统
spring boot·python·django·flask·node.js·php
Q_Q5110082853 天前
python+django/flask+vue基于spark的西南天气数据的分析与应用系统
spring boot·python·spark·django·flask·node.js