ジャーニーマン( @beajourneyman )です。
Datadogで案外大事なケースを踏んで、大事故にはならずに対処した経験から、監視文字列の基本的なルールについて備忘録を残します。
結論、文字列はセグメント化されて認識されているので文字列のまとまりを意識する必要がある
監視したい文字列と監視文字列の塊として認知されている文字列の差異。
Sabroismale
[Sabro]で検索したくてもできない。[Sabroismale]で設定する。
Sabro_is_male
[Sabro]で検索したくてもできない。[Sabro_is_male]で設定する。
Sabro:is_male
こちらはどうだろう。こちらも [Sabro]で検索したくてもできない。[Sabro:is_male]で設定する。
セグメント化の詳細は以下に詳しいので紹介します。[Sabro.com]も同じく[Sabro]では検索できません。
経緯と対応
もしかして検知されていない?
今回3つ目のパターンの[is_male]に相当する監視文字列を設定していましたが、検知されませんでした。たまたま、利用サービスのレコード生成ルール刷新という大型アップデートが順次ローンチされたタイミングで不測の事態に構えていたため、早期検知できました。
Sabro:is_male
社内の監視チームに即エスカレーションして、調査をしてもらいました。
確認したところ、文字列の設定はされているものの想定通りの動作をしていない状態でした。文字列を[Sabro:is_male]に変更した場合、今回のログが想定通り検知されることを確認しました。
根本原因の究明
一旦の暫定対応ができたので、恒久対応に向けてサポートへの問合せをしてもらいました。
うまく機能しなかった原因は、Datadogの仕様として文字を特定の条件で単語としてグループ化(セグメント化)しいるためです。今回の例ですと[Sabro:is_male]でグループ化されており、こちらが文字列として最小単位となっているため[Sabro:is_male]では検索ヒットしますが[is_male]では検索ヒットしないとのことでした。
その時に提示されたのが、前述の「UNICODE TEXT SEGMENTATION」のドキュメントでした。
今後に向けて
監視チームと協議して、ヒアリングシートのひな型に今回の件で明らかになった仕様を例示つきで記載いただくコトになりました。以下趣旨の内容です。
<文字の区切り単位について>
検索文字列を検索する際、ログメッセージを一定の区切りによって分割し、その中から検索文字列に一致するものがあるかを検索します。
可能な限りスペースなどで区切られた文字列で検索文字列を指定することを推奨いたします。
例)
・英字+記号の集合は1区切りとして扱う
例) ログメッセージ"Sabro.com"は検索文字列"Sabro"で検索不可
まとめ
- Datadogの検索文字列は一定の区切り(セグメント)によって分割されて1単位として認識されている。
- 英字+記号の集合は1区切りとして扱われるるので、記号の前後の文字列では検索できない。
- 暫定対応で対処できてもそのままにせず、原因を突き止めると全体の改善につながる。
みなさん、日々の運用おつかれさまです。適切な監視で事故ない運用をしましょう!!
以上です。