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

2023年 9月 2日 31.5k 0

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

注册观测云账号

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

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

安装采集器Datakit

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

1 复制安装指令

image.png

2 在服务器上安装 DataKit

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

image.png

4 查看数据

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

APM接入

1 修改 inputs

在 DataKit 中修改 APM(ddtrace)的 inputs

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

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

2 修改 Django 应用启动方式

前置条件

pip install ddtrace

使用ddtrace-run方式启动

settings.py中配置

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中配置

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中配置

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 应用:

ddtrace-run python manage.py runserver 0.0.0.0:8082 

原方式启动 Django 程序

settings.py中配置


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中配置

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中配置

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

完整的启动命令是:

# 因为使用了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 相关数据

image.png

image.png

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

image.png

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

相关文章

JavaScript2024新功能:Object.groupBy、正则表达式v标志
PHP trim 函数对多字节字符的使用和限制
新函数 json_validate() 、randomizer 类扩展…20 个PHP 8.3 新特性全面解析
使用HTMX为WordPress增效:如何在不使用复杂框架的情况下增强平台功能
为React 19做准备:WordPress 6.6用户指南
如何删除WordPress中的所有评论

发布评论