こんばんは。torippy1024です。
本日は、Splunkのデータ格納先であるインデックスの種類の一つ、メトリクスについてまとめます。
Splunk Observability Cloudの登場によりじゃっかん存在感が薄れた機能ですが、インフラメトリクスに絞って使用すると結構使える機能だと思いました。
一般論としてのメトリクスとSplunkにおけるメトリクス
メトリクスとは、オブザーバビリティの3本柱の一つとしても言われますが、一般的には、「ITシステムの状態や性能を表す定量的な測定値」などと定義されています。CPU、メモリ、ネットワーク、ディスクなどのOSのパフォーマンス値はメトリクス(OSインフラのメトリクス)です。アプリケーション観点で言えば、トランザクション数、レスポンスタイム、エラー数などもメトリクスになります。
Splunk Enterprise/Splunk Cloudでは、以下のように用語が定義されています。
| 用語 | 説明 |
|---|---|
| メトリクス名(metric_name) | 測定対象メトリクスの名前 |
| メトリクス値(numeric_value) | メトリクスの値。数値 |
| 測定値(measurements) | metric_nameとnumeric_valueのペアのこと |
| タイムスタンプ(timestamp) | 測定値(measurements)が得られた時刻 |
| ディメンジョン(dimensions) | 測定値(measurements)を説明するためのメタデータ |
| メトリクスデータポイント | 単一のタイムスタンプと、測定値とディメンジョンを合わせたデータポイント |
| 時系列メトリクス(Metric Time Series) | メトリクス名とディメンジョンが一致するデータポイントの集合 |
以下のサンプルコマンドに使われているメトリクスデータポイントをJSONで構造化すると以下のようになります。
{
"time": 1505356687.894, # timestamp
"host": "collectd", # dimensions
"sourcetype": "collectd_http", # dimensions
"event": "metric",
"fields": {
"metric_name:protocols.IpExt.protocol_counter.InOctets": 164.91967989313392, # measurements
"interval": 10.0, # dimensions
"dstypes": "derive" # dimensions
}
}
ここで、重要なことに気づく方もいるかもしれません。
メトリクスとは、Splunkが最も強みを発揮する非構造化データではなく、構造化データだということです。
構造化データとはいえ、リアルタイムにデータを取り込んで可視化するというSplunkの特性は変わりませんし、メトリクスによって異常を検知した後は、ログによって何が発生したか調査する必要も発生します。この意味で、Splunkにログやメトリクスを一元的に収集し可視化することによって、オブザーバビリティを強化するという流れには納得感があると思われます。
Splunkにおけるインデックスタイプの違い
Splunkのインデックスには、2つのタイプがあります。イベントインデックスとメトリクスインデックスです。
通常の生のイベントデータを格納するインデックスはイベントインデックスと呼ばれます。
メトリクスインデックスは、メトリクスを格納するために最適化されたインデックスで、メトリクスデータのみを効率的に格納・取り出しすることができます。
Overview of metrics
https://help.splunk.com/en/splunk-enterprise/get-data-in/metrics/10.4/introduction-to-metrics/overview-of-metrics
先述したように、メトリクスデータは構造化データです。このために、Splunkはイベントインデックスとは別にメトリクスインデックスというものを用意して、メトリクスを効率的に処理できるような仕組みを持っていると考えられます。
メトリクスデータの取り込み方法
最も簡単なメトリクスデータの取り込み方法は、おそらくAdd-onを使うことです。(公式ドキュメントを見るとStatsDだとかcollectdだとかを使って取り込むことが記載されていますし、最近だとOTelを使うことが推奨されている気がしますが)
Splunk Add-on for Unix and Linux(Splunk_TA_nix;https://splunkbase.splunk.com/app/833 )や、Splunk Add-on for Microsoft Windows(Splunk_TA_windows;https://splunkbase.splunk.com/app/742 )に、デフォルトでメトリクスを収集するための入力設定が含まれているので、これを利用してメトリクスデータを取り込むのが初心者には簡単かもしれません。
具体的には、メトリクスインデックスをsplunk上で作成した後、Forwarder上の以下の入力Stanzaに対し、local/inputs.confを作成してdisabled=0, index = (メトリクスインデックス名)を指定すればよいです。
(Windowsoの場合、mode = singleを指定してイベントをシングルラインで転送する設定を追加することと、AD/DNS用の入力を含めるか判断し設定してください)
メトリクスデータ自体をイベントインデックスに取り込ませることも可能ですが、メトリクスインデックスに取り込ませたほうが処理は効率的だしデータ量自体も圧縮できるため、可能であればメトリクスインデックスにデータを取り込ませることを推奨します。
###### Splunk 5.0+ Performance Counters ######
## CPU
[perfmon://CPU]
disabled = 0
mode = single
index = <metrics_index>
## Logical Disk
[perfmon://LogicalDisk]
disabled = 0
mode = single
index = <metrics_index>
## Physical Disk
[perfmon://PhysicalDisk]
disabled = 0
mode = single
index = <metrics_index>
## Memory
[perfmon://Memory]
disabled = 0
mode = single
index = <metrics_index>
## Network
[perfmon://Network]
disabled = 0
mode = single
index = <metrics_index>
## Process
[perfmon://Process]
disabled = 0
mode = single
index = <metrics_index>
## ProcessInformation
[perfmon://ProcessorInformation]
disabled = 0
mode = single
index = <metrics_index>
## System
[perfmon://System]
disabled = 0
mode = single
index = <metrics_index>
### 以下のメトリクスはAD/DNS用のためAD/DNSサーバーに対してのみ指定 ###
###### Perfmon Inputs from TA-AD/TA-DNS ######
[perfmon://Processor]
disabled = 0
mode = single
index = <metrics_index>
[perfmon://Network_Interface]
disabled = 0
mode = single
index = <metrics_index>
[perfmon://DFS_Replicated_Folders]
disabled = 0
mode = single
index = <metrics_index>
[perfmon://NTDS]
disabled = 0
mode = single
index = <metrics_index>
[perfmon://DNS]
disabled = 0
mode = single
index = <metrics_index>
[script://./bin/vmstat_metric.sh]
disabled = 0
index = <metrics_index>
[script://./bin/iostat_metric.sh]
disabled = 0
index = <metrics_index>
[script://./bin/ps_metric.sh]
disabled = 0
index = <metrics_index>
[script://./bin/df_metric.sh]
disabled = 0
index = <metrics_index>
[script://./bin/interfaces_metric.sh]
disabled = 0
index = <metrics_index>
[script://./bin/cpu_metric.sh]
disabled = 0
index = <metrics_index>
メトリクスデータの分析方法
メトリクスインデックスに対しては、通常のSearchコマンドを使ったサーチはできません。
メトリクスインデックス用のSPLを使用する必要があります。
代表的なサンプルを以下に記載しますので、試してみてください。
特定のインデックスとホストに関するメトリクス名の一覧を表示するSPL
| mcatalog values(metric_name) WHERE index=* BY index host
特定のホストとメトリクス名に関するdimensionの一覧を表示するSPL
| mcatalog values(_dims) WHERE index=* BY host metric_name
全インデックスを対象に、メトリクス名がcpu_metric.pctUserであるメトリクス(ユーザーのCPU利用率)をホスト別に15分間隔で時系列表示するSPL(Linuxの場合)
| mstats avg(cpu_metric.pctUser) WHERE index=* span=15m BY host
全インデックスを対象に、メトリクス名が% Processor Timeであるメトリクス(全体のCPU利用率)をホスト別に15分間隔で時系列表示するSPL(Windowsの場合)
| mstats avg("% Processor Time") WHERE index=* by host span=15m
備考
このメトリクスの分析は、Splunk Enterprise/Splunk Cloudの機能です。
Splunkのオブザーバビリティ製品であるSplunk Observability Cloudとは別の仕組みで動いているものなので注意してください。
Splunk Observability Cloudでは、OpenTelemetryの仕組みを使ってトレースやメトリクスを収集しており、APMなど、アプリケーションに関するメトリクスやトレースなどを取得し可視化したい場合はSplunk Observability Cloudのほうが便利です。
ただ、カスタムメトリクスがなく、インフラメトリクスを可視化するだけであれば、上で紹介したSplunk Enterprise/Splunk Cloudが用意しているメトリクスインデックスを使った仕組みでも十分な場合はあるでしょう。サーバーに導入するエージェントを、Forwarderのみで完結させることができる点もメリットです。
(mstats/mcatalogなど、メトリクスインデックス用のSPLを追加で覚えなければならないという点は多少のデメリットかもしれませんが・・・)
参考資料
Overview of metrics
https://help.splunk.com/en/splunk-enterprise/get-data-in/metrics/10.4/introduction-to-metrics/overview-of-metrics
metric time series
https://docs.splunk.com/Splexicon:Metrictimeseries
Search examples
https://help.splunk.com/en/splunk-enterprise/get-data-in/metrics/10.4/work-with-metrics/search-and-monitor-metrics#ariaid-title2