codeigniter 无内置 datadog 集成,需通过 datadog-agent 日志采集或调用 datadog logs api 实现监控告警;官方未提供 sdk,社区包多已过时,推荐 json 日志+log pipeline 方式,注意区域 url、密钥权限与日志格式规范。

CodeIgniter 本身不内置 Datadog 集成,要实现监控报警,必须手动对接 Datadog 的 API 或日志管道 —— 没有现成的 datadog 库或 $this->datadog->send() 方法可用。
为什么不能直接在 CodeIgniter 中“使用 Datadog”
CodeIgniter 是轻量 PHP 框架,不提供开箱即用的 APM(应用性能监控)客户端。Datadog 官方未发布官方 CodeIgniter SDK,所有集成都需基于其通用机制落地:
- Datadog Agent 采集日志(推荐路径):把 CI 的错误日志、自定义指标写入文件,由运行在服务器上的
datadog-agent收集并转发 - HTTP API 上报(适合告警事件):用
curl或file_get_contents向https://api.datadoghq.com/api/v1/series或/v2/logs发送结构化数据 - 不建议用第三方社区包(如
ci-datadog):多数已多年未更新,不兼容 CI3.1+ 或 CI4,且无认证/重试/批量等生产级能力
用日志管道接入 Datadog(最稳方案)
这是线上环境首选方式,复用现有 log_message() 机制,零侵入业务逻辑:
- 确保 CodeIgniter 日志路径可被
datadog-agent读取(例如./application/logs/) - 在
datadog-agent的conf.d/agent.d/conf.yaml中添加日志采集配置:
logs:
- type: file
path: "/var/www/myapp/application/logs/log-*.php"
service: "codeigniter-app"
source: "php"
tags: ["env:prod"]
- 在 CI 中触发关键事件时打日志,用 JSON 格式便于 Datadog 解析:
log_message('error', json_encode([
'event' => 'db_query_failed',
'controller' => $this->router->class,
'method' => $this->router->method,
'query' => $last_query,
'duration_ms' => round($elapsed * 1000)
], JSON_UNESCAPED_UNICODE));
- 在 Datadog 控制台创建日志管道(Log Pipeline),用
status:error提取告警字段,并绑定到告警规则
用 API 主动上报错误或指标(适合紧急告警)
当需要绕过日志延迟、立刻触发告警(如支付失败、用户登录异常),可调用 Datadog Logs API:
- 必须设置
DD-API-KEY环境变量或硬编码(不推荐),URL 因区域而异:https://http-intake.logs.datadoghq.com(US1)、https://http-intake.logs.datadoghq.eu(EU)等 - 请求体必须是
gzip压缩的 NDJSON(每行一个 JSON 对象),否则返回400 Bad Request - 示例(PHP 7.4+,用
curl):
$payload = json_encode([
'message' => 'Critical auth failure',
'service' => 'ci-auth',
'host' => gethostname(),
'status' => 'error',
'ddsource' => 'php',
'ddtags' => 'env:prod,layer:controller'
], JSON_UNESCAPED_UNICODE);
<p>$ch = curl_init('<a href="https://www.php.cn/link/6a11646e982284c18c05ffd73dd14bdc">https://www.php.cn/link/6a11646e982284c18c05ffd73dd14bdc</a>');
curl_setopt_array($ch, [
CURLOPT_POST => true,
CURLOPT_POSTFIELDS => gzencode($payload),
CURLOPT_HTTPHEADER => ['Content-Encoding: gzip', 'Content-Type: application/json'],
CURLOPT_RETURNTRANSFER => true
]);
curl_exec($ch);
curl_close($ch);
</p>
- 注意:不要在高频请求(如每秒百次)中调用此逻辑,会拖慢响应;应限流或异步队列处理
容易被忽略的权限与调试点
实际部署中最常卡住的地方不是代码,而是基础设施层的连通性与格式细节:
-
datadog-agent必须和 CI 应用在同一台机器,或能访问其日志目录(NFS/S3 不支持原生日志采集) - CI 的
log_threshold至少设为1(ERROR),否则log_message('error', ...)不写盘 - Datadog EU 用户若误用 US1 的 intake URL,会静默丢弃日志,且无错误反馈 —— 必须核对
DD_SITE环境变量或 URL 域名 - 用
curl -v测试 API 请求时,留意响应头中的X-Datadog-Trace-ID和403 Forbidden(密钥错误)或413 Payload Too Large(单条日志超 256KB)











