この記事は Mackerel Advent Calendar 2025 23日目の記事です。
はじめに
みなさんこんにちは。
株式会社はてなでMackerelのセールスを担当している栗原です。
MackerelのAPMはOpenTelemetryを採用していますが、マグル(非エンジニア)の私はOpenTelemetryというものを触ったことがありませんでした。
普段はセールスとしてMackerelやオブザーバビリティの価値をお伝えしていますが、そもそも自分でやってみないと「簡単に始められます」って言えなくないか?
と思いたち、OptenTelemetryの計装やCollectorの設定を自分でやってみることにしました。
今回はその「やってみた」中身をご紹介します。
とはいえ、これまで営業一筋でやってきたものですから、お見苦しい失敗がたくさんあります。どうか温かい目で読んであげてください。
準備したもの
・わかった気になる分散トレーシング - OpenTelemetryでトレーシングに入門するハンズオン
・Mackerel OpenTelemetry Collector
・Docker
・Gemini
・Gemini CLI
1. 歓喜の第一歩:デモアプリが動いた!
まずは、GitHubの mackerel-handson リポジトリを使い、環境構築からスタート。 Dockerのエラーで出鼻をくじかれましたが、AIの助けを借りてなんとか突破。
さすが弊社のCREが用意しているハンズオン。マグルの私でもわりと簡単にできました。

2. 「Mackerel仕様」への改造と、属性の付与
次に、既存のCollectorから Mackerel OpenTelemetry Collectorへと差し替えました。
さらに、データに「属性(Attributes)」を付与する設定を追加。 「このデータは栗原のテスト環境から送られたものですよ」という印を付ける作業です。設定ファイル(YAML)のインデント一つでエラーが出るシビアな世界に、少しずつ足を踏み入れていきました(YAMLってヤムルって読むのか???という疑問を抱きつつ)。
↓User にkuriharaと入るように設定できました

3. 高度な設定「サンプリング」への挑戦
ここで、Phase 2の仕上げとして 「Tail Sampling」 を設定しました。 これは、「全てのデータを送るのではなく、条件に合うものだけを送る」という高度な設定です。
今回は「処理に 700ms(0.7秒)以上 かかった、遅いリクエストのトレースだけをMackerelに送る」というルールにしました。デモ環境でわざと処理に時間がかかるようにして、700ms以上のトレースを生成して無事に対象のトレースのみをMackerel上に送ることができました。
「思ったより簡単!」と思っていましたが、この時の私は、この設定が後に自分を苦しめる「罠」になるとは知る由もありませんでした。
↓一番右のトレースは700ms以上のトレースのみとなっていることが確認できました。

4. 独自プロジェクト:AIと作った simple_tracer.py
次に「既存のハンズオン環境ではなく、自ら計装してこそ本当の理解だ」 そう思い、AIにPythonスクリプトを書いてもらいました。
その名も simple_tracer.py。 ただ一行、"Hello OpenTelemetry!" というトレースをCollector経由でMackerelに送るだけの、純粋でシンプルなプログラムです。
pip install でSDKを揃え、いざ、実行!……しかし、Mackerelの画面は沈黙したままでした。
5. 襲いかかるデバッグの三重苦
ここから泥沼のデバッグが始まりました。
とても初歩的なミスでしたが、マグルの私にとっては泥沼だったのです。
① 接続拒否(Connection Refused)
スクリプトを叩いてもエラー。
原因:受信側であるCollectorのコンテナを立ち上げ忘れていました。「郵便局が閉まっていれば、手紙は届かない」とAIに諭されました。お恥ずかしい。
② APIキーの迷宮
Collectorを動かしても届かない。
原因:設定ファイルの変数名が APIKEY と API_KEY で食い違っていました。タイポ一つでシステムは沈黙します。デリケートですね。
6. 最後の壁:自分自身が仕掛けた「700msの罠」
APIキーも直し、エラーも消えた。しかし、なぜかMackerelにデータが届きません。トレースは送れているはずなのに何故???
AIとログを血眼になって確認した結果、衝撃の事実が判明しました。
原因は、Phase 3で設定した「700ms以上のトレースのみ送信する」というサンプリング設定でした。
私の作った simple_tracer.py は、あまりに単純すぎて 700ms以下 で処理が終わってしまいます。そのため、Collector側で「これは速すぎるから不要なデータだ」と判断され、Mackerelに届く前に捨てられていたのです。
過去の自分が「完璧だ」と自慢げに書いた設定が、現在の自分の首を絞めていたのです……。
7. そして成功へ:可視化された「my-first-span」
サンプリング設定を修正し、震える指でスクリプトを実行。 ついに、Mackerelの画面に「my-first-span」の文字が踊りました。
エンジニアの皆様からすれば、ほんの一歩かもしれません。 しかし、自ら設定を書き、エラーを吐かれ、自らの罠に嵌り、それを乗り越えて届いたこの一筋のトレースは、私にとってはとても価値のあるトレースとなりました。

おわりに
今回の検証を通して、OpenTelemetryとはどれくらい簡単なのか、どれくらいの時間でできるのかを学ぶことができました。
マグルの私でもある程度はできたので、きっとエンジニアの方ならチョチョイのチョイだと思います。
これからも自信を持って「Otelってそんなに難しくないですよ!」とカッコつけながらMackerelの魅力を伝えていきたいと思います。