Snowpark Container ServicesのEvent-table Service Metricsについてまとめる

## はじめに

Snowpark Container Services (SPCS)を運用する上で、サービスの状態監視は重要な要素です。本記事では、SPCSで利用可能なメトリクス収集の方法、特にEvent-table Service Metricsについて詳しく解説します。

## メトリクス収集の2つの方法

SPCSでは、以下の2つの方法でメトリクスを収集できます。
この記事ではEvent-table Service Metricsに焦点を絞って解説していきます。

1. Event-table Service Metrics
   - サービス個別のメトリクス収集
   - Service Specificationで収集するメトリクスを定義
   - Event Tableに記録され、SQLで分析可能

2. Compute Pool Metrics
   - コンピュートプール全体のメトリクス
   - Prometheusと互換性のあるAPI経由でアクセス
   - 各ノードがTCPポート9001で公開

## Event-table Service Metricsの基本

### メトリクスの構造
メトリクス名は以下の構造で構成されています：
```
<target>.<component>.<metric>
```

- target: 監視対象（例：container）
- component: 監視対象の要素（例：cpu）
- metric: 測定値の種類（例：usage）

例：`container.cpu.usage`は、コンテナのCPU使用量

### 設定方法

Service Specificationに以下のように記述することで、メトリクスの収集を有効化できます：

```yaml
CREATE SERVICE echo_service
  IN COMPUTE POOL tutorial_compute_pool
  FROM SPECIFICATION $$
    spec:
      containers:
      - name: echo
        image: /tutorial_db/data_schema/tutorial_repository/my_echo_service_image:latest
      
      platformMonitor:
        metricConfig:
          groups:
          - system
          - system_limits
      $$
```

## 利用可能なMetric Groups

### 1. system
基本的なシステムリソースの使用状況を監視します。

- CPU関連
  - `container.cpu.usage`: CPU使用量（1.0 = 1コア）
- メモリ関連
  - `container.memory.usage`: メモリ使用量（バイト単位）
- GPU関連
  - `container.gpu.memory.usage`: GPUメモリ使用量
  - `container.gpu.utilization`: GPU使用率

### 2. system_limits
リソースの制限値と要求値を監視します。

- `*.*.limit`: 各リソースの上限値
- `*.*.requested`: 各リソースの要求値
- `container.gpu.memory.capacity`: GPUメモリの容量

### 3. status
コンテナの状態を監視します。

- 状態フラグ
  - `container.state.running`: 実行中
  - `container.state.pending`: 待機中
  - `container.state.finished`: 終了
- 付随情報
  - `container.restarts`: 再起動回数
  - `container.state.last.finished.reason`: 終了理由
  - `container.state.last.finished.exitcode`: 終了コード

### 4. network
ネットワークトラフィックを監視します。

- 送信
  - `network.egress.transmitted.bytes`: 送信バイト数
  - `network.egress.transmitted.packets`: 送信パケット数
- 受信
  - `network.egress.received.bytes`: 受信バイト数
  - `network.egress.received.packets`: 受信パケット数
- 拒否
  - `network.egress.denied.packets`: ポリシーによる拒否パケット数

### 5. storage
ファイルシステムの使用状況を監視します。

- 容量と使用量
  - `volume.capacity`: ファイルシステムの総容量
  - `volume.usage`: 使用容量
- I/O性能
  - `volume.read.throughput`: 読み取りスループット
  - `volume.write.throughput`: 書き込みスループット
  - `volume.read.iops`: 読み取り操作数/秒
  - `volume.write.iops`: 書き込み操作数/秒

## メトリクスの分析

Event-table Service Metricsは、SQLを使用して簡単に分析できます。

### 基本的なメトリクス確認
```sql
SELECT timestamp, record, value
  FROM my_events
  WHERE timestamp > DATEADD(hour, -1, CURRENT_TIMESTAMP())
    AND RESOURCE_ATTRIBUTES:"snow.service.name" = '<SERVICE_NAME>'
    AND RECORD_TYPE = 'METRIC'
    ORDER BY timestamp, group DESC
    LIMIT 10;
```

### CPU利用率の変化確認
```sql
SELECT RECORD:"metric":"name" as metrics_name, value::double, timestamp
  FROM <EVENT_TABLE_NAME>
  WHERE timestamp > DATEADD(hour, -1, CURRENT_TIMESTAMP())
    AND RESOURCE_ATTRIBUTES:"snow.service.name" = '<SERVICE_NAME>'
    AND RECORD_TYPE = 'METRIC'
    AND ((RECORD:"metric":"name" = 'container.cpu.usage') 
         or (RECORD:"metric":"name" = 'container.cpu.requested') 
         or (RECORD:"metric":"name" = 'container.cpu.limit'));
```

### メモリ使用量の変化確認
```sql
SELECT RECORD:"metric":"name" as metrics_name, 
       value::int / (1024*1024*1024), 
       timestamp
  FROM <EVENT_TABLE_NAME>
  WHERE timestamp > DATEADD(hour, -10, CURRENT_TIMESTAMP())
    AND RESOURCE_ATTRIBUTES:"snow.service.name" = '<SERVICE_NAME>'
    AND RECORD_TYPE = 'METRIC'
    AND (RECORD:"metric":"name" = 'container.memory.usage')
    LIMIT 1000;
```

## まとめ

SPCSを運用していく上で必要になってくるメトリクスについてまとめました。
Event-table Service MetricsはService Specificationに数行記述するだけでEvent TableにCPU利用率などのメトリクスを即座に記録することができるようになる便利な機能です。
うまく使いこなしてSPCSで構築したサービスを安定稼働させていきましょう💪