最初にまとめ
最初に結論を書いておくと
- Datadog Logs の Generate Metrics の機能を、Nginx の request_time に対して有効にしたかった
- Datadog Logs の Configuration の Pipelines の Grock Parser で
regex(".*")
を使っており、string(文字列)で認識された - そのため Measure としての認識ができず、Generate Metrics も動作しなかった
- この件を通して、Datadog Logs では数値として認識されると緑色で表現されることを知りました
もうちょっと詳細
困ったこと
Datadog Logs にはログからメトリクスを生成する便利な Generate Metrics 機能があります。
今回、Nginx の request_time
の値からメトリクスを生成しようとしました。
request_time
には、 0.003
のような Second の値が記録されます。
このようなメトリクスを生成するためには、 Datadog Logs の Facet を Measure(測定)にする必要があるため変更したところ、認識エラーとなってしまいました。
以下は、Measureに変更したことで request_time
が正しくIndexされていない図です。 Information マークが付与されており Not indexed ... のようなメッセージが表示されていました。
Datadog サポートのナイス回答
ほとほと困ってDatadogサポートに問い合わせたところ、以下のような回答をもらいました。
This issue appears to be due to the way the logs are submitted. Facets don't actually do any type conversion, the type you specify in the UI is actually just defining the expected type. It sounds like in this case that some logs are being sent with as a string value. For example: myValue = "5" is type string. myValue = 5 is type integer. Quotes around the submitted value are indexed as string, where no quotes will be an integer. The UI will indicate whether the attribute is a string or an integer by highlighting the value in green.
簡単に言えば"文字列として認識しているので数字として認識できるように修正しろ"と指摘してくれています。
そこで Piplines の Grock Parse の該当箇所を見直したところ %{regex(".*"):http.request_time}
としていました。
これを %{number:http.request_time}
と修正したことで、数字として認識されるようになりました。
Integer としなかったのは、 request_time
が 0.003
のような少数を含む数字だからです。
ログのパースについては以下を参照すると、便利な Matchers(マッチ条件)
がいくつもあるので、 regex(".*")
で雑にパースするよりは、それらを利用することをオススメします。
こうして Matcher として number
を利用したことで、数字として認識され、エラーも消えて緑色として表示されるようになりました。
無事に Generate Metrics に成功
このおかげで無事に request_time
について Generate Metrics によるメトリクス生成に成功しました。
request_time
はWebアクセスの処理時間として重要なSLIになりますので、ログからこれらを計測できるのは可観測性につながると考えています。
的確な回答をくれた Datadog サポートに感謝です!