Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Datadog, 無い機能なら作ってしまえ、カスタムメトリック

Avatar for 1kano 1kano
May 31, 2025

Datadog, 無い機能なら作ってしまえ、カスタムメトリック

インフラ監視からアプリ性能モニタリング、セキュリティやインシデント対応など様々な運用を実現できるDatadogだが、かゆいところにズバリ欲しい機能が見つからない時もある。値さえ取得できればメトリックを生成してダッシュボードで可視化できる。カスタムメトリックで実現できる。

Avatar for 1kano

1kano

May 31, 2025
Tweet

Other Decks in Technology

Transcript

  1. 自己紹介 Profile ◼ 所属/経歴 • 電機メーカー勤務 • 経歴 1. サーバーのグローバル製造技術/営業

    2. データセンター・プロジェクト 3. マネージドサービス(マルチクラウド・ハイブリッドクラウド) ◼ 個人活動 • 副業:FunnyGeek ITサービス(ファニーギーク) • ボランティア:CoderDojo青梅(主宰/Champion) • IBM チャンピオン:IBM Champion 2018-2025, 8year Milestone • Datadog アンバサダー:Datadog Ambassador 2024-2025 • 特定非営利活動法人 青梅こども未来 プログラミング講師 • 特定非営利活動法人 青梅の虹any, Rainbow Room プログラミング講師 • 特定非営利活動法人 多摩川流域生活支援ネットワーク, ポラリスキッズ プログラミング講師 • 一般社団法人 情報通信ネットワーク産業協会 CIAJ 調査統計員会 2024委員長 • 一般財団法人 科学技術継承財団 理事 KANO Ichiro 鹿野 市郎
  2. 副業(マンツーマン・プログラミング) 個別支援プログラミング講師  特定非営利活動法人 青梅こども未来  特定非営利活動法人 青梅の虹any, レインボールーム 

    特定非営利活動法人 多摩川流域生活支援ネットワーク, ポラリスキッズ • 初級プログラミング Scratch • 上級プログラミング JavaScript, MySQL • キントーン導入&伴走サポート • PC導入&修理 • WEBサイト制作
  3. きっかけ(会社での話) 応答時間 tcp.response_time 接続可否 tcp.can_connect 接続総数 net.tcp.current_established 接続総数 net.tcp.connections あれ?

    特定TCPポートの接続数が見つからない... Hi イチロー TCPポート毎の接続数はモニタリングできないけれど、よさげな要望なので 将来リクエストに投稿しとくね。 代案は netstat か ss コマンドでTCPポート数をカウントするのはどう?
  4. Linuxコマンド $ ss –ant4 | grep ':22' | grep ESTAB

    | wc –l 2 [ss]コマンドでTCPポートの状態を取得できる LISTEN 0 128 0.0.0.0:22 0.0.0.0:* ESTAB 0 1154 133.18.***.***:22 115.151.***.***:45448 ESTAB 0 52 133.18.***.***:22 220.146.***.***:50794 値を取得できれば、Datadogのメトリックを作成できる! Datadog エージェント カスタム Check ダッシュボード
  5. やり方(Datadogエージェントでのカスタムメトリック) Step2 チェックを作る from datadog_checks.base import AgentCheck class KanoCheck(AgentCheck): def

    check(self, instance): try: tcp_port = instance.get(‘port‘); // コンフィグの値を読む command = "ss -ant4 | grep ':" + tcp_port + "' | grep ESTAB | wc -l"; result = subprocess.run( command, shell=True, 略 ) # 結果をメトリックスとしてDatadogインテークサーバーへ送信 self.gauge( 'custom_tcp.connections', ← 好きなメトリック名を定義 int( result.stdout.strip() ), ← メトリックの値 [例: suctome_tcp.connections = 2] tags=['host:kano_server'] ← 好きな属性を追加 ) 注:あちこち省略してます /etc/datadog-agent/checks.d/kano.py
  6. 運用しているサーバー5台(ボランティア, 副業) JitsiMeet Minecraft apache1 apache2 apache3 mySQL Node-RED nginx

    WordPress1 WordPress2 WordPress3 node.js mySQL WEBサイト WEBアプリ開発 ジッチミート, DBサーバー マイクラ サンドボックス(トライアル)
  7. ジッチミート・サーバー JitsiMeetには 統計 を取得するAPIがある { "endpoints_with_suspended_sources":0, "inactive_endpoints":2, "inactive_conferences":1, "total_ice_succeeded_relayed":0, "bit_rate_download":1,

    "local_active_endpoints":0, "muc_clients_connected":1, "total_participants":2, "total_packets_received":0, "rtt_aggregate":0.0, "packet_rate_upload":0, "p2p_conferences":1, "preemptive_kfr_suppressed":0, "local_endpoints":2, "octo_send_bitrate":0, "total_dominant_speaker_changes":0, "endpoints_with_spurious_remb":0, "receive_only_endpoints":0, "octo_receive_bitrate":0, "total_colibri_web_socket_messages_received":0, "total_visitors":0, "version":"2.3.220-g7cda0a66", "total_colibri_web_socket_messages_sent":0, "total_bytes_sent_octo":0, "total_ice_succeeded":2, "total_data_channel_messages_received":7, "total_conference_seconds":0, "visitors":0, "num_eps_oversending":0, "bit_rate_upload":0, "total_conferences_completed":0, "octo_conferences":0, "num_eps_no_msg_transport_after_delay":0, "endpoints_sending_video":0, "packet_rate_download":5, "muc_clients_configured":1, "outgoing_loss":0.0, "overall_loss":0.0, "total_packets_sent_octo":0, "total_layering_changes_received":0, "total_relays":0, "endpoints_with_high_outgoing_loss":0, "stress_level":0.12951601908657123, "drain":false, "total_video_stream_milliseconds_received":0, "shutting_down":false, "octo_endpoints":0, "current_timestamp":"2025-04-21 13:33:36.656", "num_relays_no_msg_transport_after_delay":0, "conferences":1, "participants":2, "total_keyframes_received":0, "average_participant_stress":0.01, "largest_conference":2, "total_packets_sent":0, "endpoints":2, "total_data_channel_messages_sent":10, ・・・ $ curl http://localhost:8080/colibri/stats
  8. ジッチミート・サーバー カスタムメトリックを取得する checks.d と conf.d from datadog_checks.base import AgentCheck import

    requests __version__ = "0.0.1" class KanoJitsimeetCheck(AgentCheck): def check(self, instance): url = instance.get('url') if not url: self.log.error("No URL provided in instance configuration") raise ValueError("The 'url' field is required in the instance configuration") try: response = requests.get(url) if response.status_code == 200: data = response.json() self.gauge('custom_jitsimeet.total_participants', data.get('participants', 0)) self.gauge('custom_jitsimeet.total_conferences', data.get('conferences', 0)) else: self.service_check('custom_jitsimeet.api_check', self.CRITICAL) except Exception as e: self.log.error(f"Error while fetching data from {url}: {e}") self.service_check('custom_jitsimeet.api_check', self.CRITICAL) /etc/datadog-agent/conf.d/jitsimeet.yaml init_config: instances: - name: jitsimeet_stats_check url: http://localhost:8080/colibri/stats timeout: 5 headers: Accept: application/json tags: - environment:jitsimeet - api:colibri-stats collect_response_time: true method: GET include_content: true /etc/datadog-agent/conf.d/http_check.yaml