CodeIgniter 默认不触发 Datadog 日志采集,因其错误日志写入 application/logs/ 文件,而 Datadog Agent 默认仅采集 stdout、/var/log/ 下路径或显式配置的 log_files;需在 conf.yaml 中启用 logs_enabled 并声明日志路径、权限及服务标签。

CodeIgniter 本身不内置 Datadog 集成,要实现监控报警,必须手动对接 Datadog 的日志、指标或事件 API。直接在框架里调 datadog-agent 或 dd-trace-php 是行不通的——除非你额外装扩展并配置 PHP Agent。
为什么默认不触发 Datadog 日志采集
CodeIgniter 的错误日志(application/logs/)默认是文件写入,而 Datadog Agent 默认只采集标准输出(stdout)、/var/log/ 下特定路径或通过 log_files 显式声明的日志路径。如果你没改过日志路径,Agent 根本看不到 application/logs/log-*.php。
- 确认你的 Agent 是否启用了日志收集:
logs_enabled: true在/etc/datadog-agent/conf.d/php.d/conf.yaml或全局datadog.yaml中 - 必须显式添加日志路径,例如:
logs: - type: file path: "/var/www/myapp/application/logs/log-*.php" service: "codeigniter-app" source: "php" - 确保 Web 服务器(如 Apache/Nginx)和 PHP 进程对日志目录有读权限,否则 Agent 会静默跳过
如何把 CodeIgniter 错误推给 Datadog 事件(Event)
CodeIgniter 的 log_message() 只写文件,但你可以用 curl 或 file_get_contents() 手动发事件到 Datadog API。适合关键错误(如数据库连接失败、支付回调异常)主动上报。
- Datadog 事件 API 地址取决于你所在站点,例如 EU 站是
https://api.datadoghq.eu/v1/events,US1 站是https://api.datadoghq.com/v1/events - 请求头必须带
DD-API-KEY,且 body 是 JSON:{ "title": "CI Database Connect Failed", "text": "Failed to connect to MySQL on 127.0.0.1:3306", "tags": ["env:production", "service:codeigniter"], "alert_type": "error" } - 别在
error_handler里直接curl_exec——可能引发嵌套错误。建议用stream_context_create()+file_get_contents()做超时控制(5 秒内失败就丢弃)
怎么让 CodeIgniter 指标进 Datadog(比如请求耗时、DB 查询数)
靠日志解析太重、延迟高;推荐用 statsd 协议打点,Datadog Agent 默认监听 localhost:8125 UDP 端口。
- 在控制器基类(如
MY_Controller)的__construct()和__destruct()中记录请求耗时:$start = microtime(true); // ... controller logic $duration = round((microtime(true) - $start) * 1000); $sock = fsockopen('127.0.0.1', 8125, $errno, $errstr, 0.1); if ($sock) { fwrite($sock, "ci.request.duration:{$duration}|ms|#env:production,controller:{$this->router->class}\n"); fclose($sock); } - 注意:UDP 不保证送达,不要在
fsockopen失败时抛异常,否则影响主流程 - 避免高频打点(如每条 DB 查询都发),聚合后再上报,比如在
post_system钩子中汇总$this->db->query_times
最容易被忽略的兼容性问题
CodeIgniter 3.x 默认用 mysql 驱动(已废弃),而 Datadog 的 ddtrace PHP 扩展只支持 mysqli 和 PDO 的自动追踪。如果你没改 dbdriver,即使装了 ddtrace,SQL 查询也不会出现在 Datadog APM 里。
- 检查
application/config/database.php中'dbdriver' => 'mysqli'是否生效 - 确认
extension=ddtrace.so已加载(php -m | grep ddtrace),且DD_TRACE_ENABLED=1环境变量设对 - CI3 不支持
pdo_mysql自动 fallback,写错驱动名会静默降级为mysql,导致 APM 断连


















