本文介绍django的链路数据收集,踩了一些坑,现在分享一下接入过程。
注册观测云账号
先注册一个账号, 注册地址
注册流程很简单,按照提示点点点就完事了
安装采集器Datakit
登录观测云页面,选择「集成」 - 「DataKit」,选择适合自己环境的安装指令,复制。 我这里是linux环境,其他小伙伴可以按照提示选择对应的安装脚本。
1 复制安装指令
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
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 相关数据
调用链路的问题追踪: 可以排查接口、数据库等问题
同时支持火焰图、span列表、调用关系多种形式查看,非常nice,如果开启了profiling,还能到代码函数级别的查看。