もりはやメモφ(・ω・ )

ITとか読書感想文とか

Datadog の Glock の Parseで 文字列にしてしまって Generate Metrics ができなかったメモ

最初にまとめ

最初に結論を書いておくと

  • 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 の値からメトリクスを生成しようとしました。

docs.datadoghq.com

request_time には、 0.003 のような Second の値が記録されます。 このようなメトリクスを生成するためには、 Datadog Logs の Facet を Measure(測定)にする必要があるため変更したところ、認識エラーとなってしまいました。

以下は、Measureに変更したことで request_time が正しくIndexされていない図です。 Information マークが付与されており Not indexed ... のようなメッセージが表示されていました。

f:id:morihaya:20210606224732p:plain
Parsed as string

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_time0.003 のような少数を含む数字だからです。 ログのパースについては以下を参照すると、便利な Matchers(マッチ条件) がいくつもあるので、 regex(".*") で雑にパースするよりは、それらを利用することをオススメします。

docs.datadoghq.com

こうして Matcher として number を利用したことで、数字として認識され、エラーも消えて緑色として表示されるようになりました。

f:id:morihaya:20210606224827p:plain
Parsed as number

無事に Generate Metrics に成功

このおかげで無事に request_time について Generate Metrics によるメトリクス生成に成功しました。 request_time はWebアクセスの処理時間として重要なSLIになりますので、ログからこれらを計測できるのは可観測性につながると考えています。

f:id:morihaya:20210607002956p:plain
Datadog Metrics Explorer - request_time

的確な回答をくれた Datadog サポートに感謝です!