もともとはてなのPlatform SREとして活躍し、その後Mackerel CREへと転向したメンバーから、SREとしてMackerelを活用した経験や、Mackerelのテクニカルサポートをする中で見えてきたことから、知っているとMackerelをより活用できるTipsをお話します。
mackerel.io元SREのCREが伝えたい、Mackerelをもっと活用するための実践Tips集2023.09.26Mackerel DrinkUp #11
View Slide
はなすこと今日の内容は 実運用から見えてきたMackerelをより活用するためのtips集 - Mackerel Meetup復活記念連載 #4 - Mackerel お知らせ#mackerelio と重なるものがあります。2
自己紹介● do-su-0805 ( do_su_0805 )● 2015/04 ~ 2018/08○ ホスティング事業者で運用や開発業務● 2018/09 ~ 2023/07 株式会社はてな○ ~ 2023/07 Platform SRE○ 2023/02 ~ Mackerel CRE (テクニカルサポート)● エントリ○ 頑張らなくていいチームだからこそ自分の強みを増やしていきたい | はてなで働く do-su-0805 にアンケート [#8]○ Amazon ECSのログストリームを見やすく階層的に整理できるawslogs設定3
おしながき● ミュート/ダウンタイム機能の違いと、アラートグループ併用時の注意● 不要なメトリックを送らない方法● command の子孫問題と yaml での表現● AWSインテグレーションでの {target,alb}_XXXメトリック4
ミュート/ダウンタイム機能の違いと、アラートグループ併用時の注意5
ミュート/ダウンタイム機能の違いと、アラートグループ併用時の注意● ミュート : 監視ルールの通知の停止○ アラート自体は発報し、Mackerel で確認できる○ 通知グループに従ったアラート通知がされない○ 「監視・通知を設定する - Mackerel ヘルプ」内「監視ルール単位で通知を抑制する」● ダウンタイム : 監視ルールによる監視の停止○ アラート自体発報しない○ ダウンタイムを設定する - Mackerel ヘルプ6
ミュート/ダウンタイム機能の違いと、アラートグループ併用時の注意● アラートグループ : ロールや同じ監視ルールでのアラートをまとめる○ コンソールでのアラート表示や、それぞれのアラートからの通知をまとめることができる○ 例 : 100台所属するロールで一気に負荷上昇、同じ監視ルールにより100件アラートが発報し、slack通知が 100 件発生した■ アラートグループを使うと、1件の通知にまとめられる○ アラートグループでアラートをまとめる -Mackerel ヘルプ● 条件に一致したアラートの数をみている○ アラート発報後の通知先として存在はしていない 7
ミュート/ダウンタイム機能の違いと、アラートグループ併用時の注意● アラートグループの表示例8アラートグループを使用しないと、4つの通知が飛ぶ- hostA のアラートの発報、復旧- hostB のアラートの発報、復旧アラートグループを使用すると、2つの通知が飛ぶ- (hostBのアラート発生時に) アラートグループによる発報通知- (hostAのアラート復旧時に) アラートグループによる復旧通知
ミュート/ダウンタイム機能の違いと、アラートグループ併用時の注意9
ミュート/ダウンタイム機能の違いと、アラートグループ併用時の注意10- ミュートは監視ルールの通知の停止- アラートは発報する- アラートグループの対象となる監視ルールをミュートしても、アラートグループが機能し、アラートグループによる通知が行われる- ダウンタイムは監視の停止- アラートは発報しない- アラートグループの対象となる監視ルールにダウンタイムを設定すると、アラートグループは機能しなくなり、アラートグループによる通知も行われない
不要なメトリックを送らない方法11
● システムメトリックの一部では ignore が設定可能○ 指定した正規表現に合致する対象からメトリックを収集しない○ filesystem / disk / interface で設定可能● mackerel-agent仕様 - Mackerel ヘルプ不要なメトリックを送らない方法[filesystems]ignore = "/dev/ram.*"[disks]ignore = "docker*"[interfaces]ignore = "bond.*"12
● カスタムメトリック設定では {include,exclude}_pattern○ include_pattern■ 指定した正規表現に合致したメトリックのみ投稿○ exclude_pattern■ 指定した正規表現に合致しないメトリックのみ投稿○ 両方に合致する場合は投稿されない○ ホストのカスタムメトリックを投稿する - Mackerel ヘルプ● 例 : connection を含むメトリックのみ投稿されるが、max_connections は投稿されなくなる不要なメトリックを送らない方法13[plugin.metrics.mysql]command = "mackerel-plugin-mysql"include_pattern = 'connections'exclude_pattern = 'max'
メトリックプラグインの作り方14
メトリックプラグインの作り方15名前(tab)値(tab)unixtime で出力する● 例 : postgres.iotime.blk_write_time(tab)0.000000(tab)1695709766○ postgres.iotime.blk_write_time : メトリック名■ mackerel-agent.conf でのカスタムメトリック設定と先頭を揃える● [plugin.metrics.postgres]● command = ["mackerel-plugin-postgres","-user","postgres"]■ 設定名が postgres2 だったら、postgres2.iotime... になるように● [plugin.metrics.postgres2]● command =["mackerel-plugin-postgres","-user","postgres",”metric-key-prefix”,”postgres2”]○ 0.00000 : メトリックの値○ 1695709766 : unixtime■ date +%s などで計算できる
メトリックプラグインの作り方16名前(tab)値(tab)unixtime で出力する● example.hoge として 300 を出力し続ける例○ mackerel-agent.conf■ [plugin.metrics.example]■ command = [ "mackerel-plugin-300" ]○ mackerel-plugin-300■ #!/bin/sh■ echo -e "example.hoge\t300\t$(date +%s)"
メトリックプラグインの作り方17(required) 名前(tab)値(tab)unixtime で出力できる● example.hoge として 300 を出力し続ける例○
メトリックプラグインの作り方● 参考○ ホストのカスタムメトリックを投稿する - Mackerel ヘルプ○ mackerel-agent の plugin は Bash script で簡單に作れます - c4se記:さっちゃんですよ☆● Appendix : 公式プラグインは go-mackerel-plugin を利用○ go-mackerel-pluginを利用してカスタムメトリックプラグインを作成する - Mackerel ヘルプ18
command の指定方法と yaml での表現19
command の指定方法と yaml での表現● mackerel-agent でプラグインを実行する設定は2種類○ 文字列指定 : command = "check-http -h localhost"○ 配列指定 : command = [ "check-http","-h","localhost" ]● 2種類の違いは、「シェルを経由するかどうか」○ 文字列指定だとシェルを経由する○ 配列指定だとシェルを経由しない● シェルを経由する/しないの違い○ globや環境変数の展開がおこなわれる○ パイプやリダイレクションが使える20
command の指定方法と yaml での表現● globや環境変数の展開がおこなわれる○ command = "check-log --file /path/to/*.log"■ *.log が展開され、該当するファイルのリストが引数● check-log --file hoge.log fuga.log が実行○ command = "check-log --file ’/path/to/*.log’"■ ’/path/to/*.log’ が文字列として引き渡される● check-log --file /path/to/*.log が実行○ command = ["check-log","--file","/path/to/*.log"]■ “/path/to/*.log” がそのまま引数● check-log --file /path/to/*.log が実行21
command の指定方法と yaml での表現● パイプやリダイレクションが使える○ command="test -f $HOME/path/to/file || (echo 'ooooops' && exit 2)"■ 正常に実行される○ command=["test","-f","$HOME/path/to/file","||","(echo'ooooops' && exit 2)"]■ WARNING Checker "fuga" output stderr:test: extra argument '||' のようにエラー22
command の指定方法と yaml での表現● 文字列指定と配列指定どちらがいいのか○ 配列指定がおすすめ。必要に応じて文字列指定も。● yaml (mackerel-container-agent) では○ 文字列指定- command: "check-http -h localhost"○ 配列指定- command:- check-http- -h- localhost● 参考○ mackerel-agentのコマンド実行と配列指定のススメ -Mackerel お知らせ #mackerelio23
AWSインテグレーションでの{target,alb}_XXX メトリック24
AWSインテグレーションでの {target,alb}_XXXメトリック● AWS インテグレーションで ALB を連携したとき、ステータスコードに関する2種類のメトリックが存在する○ alb.httpcode_count.alb_{4,5}XX (alb_XXX)○ alb.httpcode_count.target_{2,3,4,5}XX (target_XXX)● alb_XXX は「ALB自身が応答したHTTPステータス」○ ALB の不調であるとか、そもそもターゲットに到達できないケース● target_XXX は「ターゲットが応答し、ALBがそのまま応答したHTTPステータス」○ ターゲットにリクエストが到達し、ターゲットが応答したステータス● 参考 : Application Load Balancer の CloudWatch メトリクス -Elastic Load Balancing 25
まとめ● ミュート/ダウンタイム機能の違いと、アラートグループ併用時の注意○ アラートグループを使う時はミュートだと通知が止まらない● 不要なメトリックを送らない方法○ ignore や {include,exclude}_pattern で投稿するメトリックを制限できる● command の子孫問題と yaml での表現○ 基本は配列がおすすめ、必要に応じて文字列もどうぞ● AWSインテグレーションでの {target,alb}_XXX メトリック○ albはALB自体の、targetはターゲットのステータスコード26
メトリックプラグインの作り方27Appendix
メトリックプラグインの作り方● 以下を実装することで、mackerel-agent を通じて投稿可能○ (optional) グラフ定義を投稿できる○ (required) 名前(tab)値(tab)unixtime で出力できる28
メトリックプラグインの作り方29(optional) グラフ定義を投稿できる● グラフ定義 : Mackerel がグラフを描画する時の設定○ 例 : `custom.postgres.iotime.blk_write_time` をBlock Write Time (ms) として表示する設定
メトリックプラグインの作り方30(optional) グラフ定義を投稿できる● グラフ定義の取得方法○ mackerel-agent 起動後、MACKEREL_AGENT_PLUGIN_META を1 にしてプラグイン実行○ 実行されたプラグインは、メトリック取得処理ではなくグラフ定義を出力する○ 受け取った mackerel-agent が、Mackerel に送信することでグラフ定義が登録される
メトリックプラグインの作り方31(optional) グラフ定義を投稿できる● グラフ定義のフォーマットなど、詳しくは グラフ定義を指定する を参考● optional なので、なくても問題ない○ ない場合は、メトリック名がそのまま表示される