📊

Goを改善するためのGo Telemetry

2023/12/22に公開

はじめに

こんにちは!Google CloudでオブザーバビリティやSRE関連の担当をしているエンジニアです。この記事はGoアドベントカレンダーの22日目の記事です。

Goとオブザーバビリティ

私は業務でオブザーバビリティを中心として啓蒙活動や開発を行っているわけですが、その中で常に「改善にはまず計測が必要です」というメッセージをさまざまな方々にお伝えしています。

Goでは計測のための仕組みとして( testing.B あるいは go test -bench として知られる)ベンチマーク[1]pprof が最初期から[2]用意されていて、パフォーマンス計測はかなり標準が充実した言語になっています。

そして近年もそれに満足せず、Goを改善するための計測の仕組みがいくつも提案されています。

たとえばruntime/metricsdesign #37112で提案されてGo 1.16から導入されました。これによってランタイムのメトリクスにもとづいたプログラムの制御などが少しやりやすくなりました。

そして計測というのはパフォーマンスやシステムのメトリクスだけではありません。Goには様々な標準ツールがあり、そういったツールの改善を効率よく行うためには、各ツールがどういったユーザーにどれくらい使われているかを統計的に取得する必要があります。
今日は、そうした目的に対して、新しく追加されたGo Telemetryというパッケージについて紹介します。

Go Telemetry

Go Telemetryというパッケージをご存知でしょうか。

これはGo teamが管理するレポジトリー内で開発している各種ツールの利用状況を可視化したり、専用サーバーにアップロードしたりするための各種ツールのパッケージです。

専用サーバーにアップロードされた結果は次のサイトで確認できます。

これはRuss Coxが2023年2月に投稿した "Transparent Telemetry for Open-Source Projects" という記事[3]にあるように、OSSを改善していくためにはバグレポートだけでなく、テレメトリーが有効で必要であるという思想から推進されたパッケージです。

https://www.youtube.com/watch?v=BNmxtp26I5s

Go Telemetryは現在、GoのLanguage Serverであるgopls計装されていますgopls v0.40.0からこのテレメトリーの収集は自動で行われていて、もし使っていればすでにテレメトリーデータが収集されているはずです。Visual Studio Codeでアップデートの際にREADMEを注意深く読んでいる人であれば、すでに気がついていたかもしれません。

該当箇所を引用すると

VS Code Go extension relies on the Go Telemetry to learn insights about the performance and stability of the extension and the language server (gopls). Go Telemetry data uploading is disabled by default and can be enabled with the following command:

というわけで、記録はされているけれど、Go teamにはまだ共有されていないことになります。じゃあどこに記録されているのかというと、皆さんのローカルストレージに記録されています。デフォルトのテレメトリーの保存先は os.UserConfigDir()/go/telemetry/local なので、各環境でアクセスしてみてください。ちなみに、 os.UserConfigDir() は次のとおりです。

  • Linux: $XDG_CONFIG_HOME あるいは $HOME/.config
  • macOS: $HOME/Library/Application Support
  • Windows: %AppData%

記録されている場合はこういったファイルが存在しています。

$ ls ~/Library/Application\ Support/go/telemetry/local/
gopls@v0.14.2-go1.21.4-darwin-arm64-2023-12-19.v1.count local.2023-11-21.json
gopls@v0.14.2-go1.21.4-darwin-arm64-2023-12-20.v1.count local.2023-11-28.json
gopls@v0.14.2-go1.21.4-darwin-arm64-2023-12-21.v1.count local.2023-12-05.json
local.2023-11-07.json                                   local.2023-12-19.json
local.2023-11-14.json                                   weekends

ここまで読んだみなさんであれば「え、自分も協力したい!どうやったら共有できるの?」と思ったことでしょう[4]

というわけで、本原稿執筆時点でのその方法をご紹介します。

gotelemetry コマンド

上のVisual Studio Code用Go拡張のREADMEの続きを読めば良いだけなのですが、gotelemetryというツールを用いて設定を変更します。インストールは普通のコマンドと同様に行います。

go install golang.org/x/telemetry/cmd/gotelemetry@latest

このツールをインストールしたあと、次のようにしてテレメトリーの共有(送信)を有効にします。

gotelemetry on

すると次のようなメッセージが表示されます。

Telemetry uploading is now enabled and data will be periodically sent to https://telemetry.go.dev/. Uploaded data is used to help improve the Go toolchain and related tools, and it will be published as part of a public dataset.

For more details, see https://telemetry.go.dev/privacy.
This data is collected in accordance with the Google Privacy Policy (https://policies.google.com/privacy).

To disable telemetry uploading, run “gotelemetry off”.

テレメトリーの送信をopt-inしたあとに、 mode という新しいファイルが生成されています。

$ cat ~/Library/Application\ Support/go/telemetry/mode
on 2023-11-19

実際に送信されるデータは、直接先に確認した os.UserConfigDir()/go/telemetry/local の中身を確認しても良いですが、Go Telemetryのウェブサイトと同様のUIで可視化したい場合には次のコマンドでウェブサーバーを起動して、ブラウザで http://127.0.0.1:4040 にアクセスしてみましょう。

gotelemetry view

すると、telemetryパッケージが数えているカウンターの指標が棒グラフの形で見れます。

ローカルで起動したGo Telemetry

何が送信されているか心配な人もこれで安心です。

今後の展開

Go teamが開発しているツールはさまざまにあります。たとえばGoのコンパイラ自体もそうですし、 go doc を始めとする go ツールや govulncheck などもそうです。

今後、こういったツールでも計装が行われるようになることでしょう。ただRuss Coxが記事でも書いている通り、コミュニティではopt-inが好まれていて、これはプライバシーに関する懸念の表れでもあります。導入を急いでせっかくの試みが頓挫しないよう、慎重に取り組んでいることがわかります。

Go teamが課題のトリアージをしやすくしたり、バグレポートに現れない情報を得やすくするためにも、これらのテレメトリーが広く認知されて使われるようになることを期待しています。

脚注
  1. ベンチマークが追加されたCLGoがオープンソースとして公開された日の直後です。 ↩︎

  2. pprofが追加されたCLも、まだweekly releaseの最初期に行われています。 ↩︎

  3. 日本語で解説された記事があるので、興味がある人はぜひこちらも参照してください。 ↩︎

  4. すでにgoplsから出されるプロンプトにしたがってopt-inしている方は以下の節をすでに実施しているかもしれません。 ↩︎

Discussion