datadogでcassandraのintegrationを使った時にエラーが出たときの対応方法


# datadogでcassandraのintegrationを使った時にエラーが出たときの対応方法

## 結論

`max_returned_metrics=XXXXXX(任意の数値)`を設定することで取得出来る

## どういう状態になったのか？

Cassandraが動いているGCEにDatadog agentをインストールした。
そして、以下の設定をansibleで設定しておいた。

```yaml:ansible_vars.yaml
      vars:
        datadog_config:
          logs_enabled: true
        datadog_checks:
          cassandra:
            init_config:
              is_jmx: true
              collect_default_metrics: true
            instances:
              - host: localhost
                port: 7199
                cassandra_aliasing: true
            logs:
              - type: file
                path: /var/log/cassandra/*.log
                source: cassandra
          cassandra_nodetool:
            init_config:
            instances:
              - keyspaces:
                  - "key-space-name"
```

しかし、datadogのUI上は `No data received`と表示されていた。
※JavaのIntegrationも同じように `No data received`と表示されていたけど、スクショ取り忘れた
![nodatareceived.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/33101/d8562415-85fd-6df4-50e8-72fa56694d92.png)
Datadogのデフォルトのdashboard上でもいくつかのグラフが表示されずに歯抜けな状態となっていた。

そこで、 `datadog-agent status` でステータスを確認してみたところ、以下になっていた。

```shell

========
JMXFetch
========

  Initialized checks
  ==================
    cassandra
      instance_name : cassandra-localhost-7199
      message : Number of returned metrics is too high for instance: cassandra-localhost-7199. Please read http://docs.datadoghq.com/integrations/java/ or get in touch with Datadog Support for more details. Truncating to 350 metrics.
      metric_count : 350
      service_check_count : 0
      status : WARNING
  Failed checks
  =============
    no checks
```

## なぜそうなったか？

[公式のドキュメント](https://docs.datadoghq.com/ja/integrations/cassandra/?tab=host#%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB)に以下が記載されている。

>注: このチェックでは、インスタンスあたりのメトリクス数が 350 に制限されています。返されたメトリクスの数は、情報ページに表示されます。以下で説明する構成を編集することで、関心があるメトリクスを指定できます。収集するメトリクスをカスタマイズする方法については、JMX チェックのドキュメントで詳細な手順を参照してください。制限以上のメトリクスを監視する必要がある場合は、Datadog のサポートチームまでお問い合わせください。

メトリクスがデフォルトの350を超えた場合は、メトリクスを切り捨てられていたのだ。

Cassandraのドキュメントには記載が無いが、[Prometheusのドキュメント](https://docs.datadoghq.com/ja/integrations/prometheus/#%E6%A7%8B%E6%88%90)には以下の記載がある。

>このインテグレーションは性格上、極めて多くのカスタムメトリクスが Datadog に送信される可能性があります。構成の誤りや入力の変化があった場合に送信されるメトリクスの最大数をユーザーが制御できるように、このチェックには 2000 メトリクスというデフォルトの制限があります。必要な場合は、prometheus.d/conf.yaml ファイルで max_returned_metrics オプションを設定することで、この制限を増やすことができます。

## 対応方法

`max_returned_metrics: XXXXXX` を追加した。

```yaml:ansible_vars_fix.yaml
      vars:
        datadog_config:
          logs_enabled: true
        datadog_checks:
          cassandra:
            init_config:
              is_jmx: true
              collect_default_metrics: true
            instances:
              - host: localhost
                port: 7199
                cassandra_aliasing: true
                max_returned_metrics: 100000 # ←を追加した
            logs:
              - type: file
                path: /var/log/cassandra/*.log
                source: cassandra
          cassandra_nodetool:
            init_config:
            instances:
              - keyspaces:
                  - "key-space-name"
```

## 問題点

datadog-agentのCPU使用率がかなり上がる。。。
そして、javaのdatadog-agentのメモリが足りなくてOOMで死にまくる。

最初は 350 -> 500 とか 500 -> 1000 とかやってても全然足りなかったみたいで、ガツンと引き上げたところ全てのメトリクスが取得できるようになった。
しかし、メトリクスが多いということはもちろんagentの負担も大きくなる。

やはり、正攻法としては、filterなどを用いて必要なメトリクスのみを収集するというところだろう。

最終的にこうなっていた

```shell
========
JMXFetch
========

  Initialized checks
  ==================
    cassandra
      instance_name : cassandra-localhost-7199
      message : <no value>
      metric_count : 44950
      service_check_count : 0
      status : OK
  Failed checks
  =============
    no checks
```