Goを改善するためのGo Telemetry
はじめに
こんにちは!Google CloudでオブザーバビリティやSRE関連の担当をしているエンジニアです。この記事はGoアドベントカレンダーの22日目の記事です。
Goとオブザーバビリティ
私は業務でオブザーバビリティを中心として啓蒙活動や開発を行っているわけですが、その中で常に「改善にはまず計測が必要です」というメッセージをさまざまな方々にお伝えしています。
Goでは計測のための仕組みとして( testing.B
あるいは go test -bench
として知られる)ベンチマーク[1]や pprof
が最初期から[2]用意されていて、パフォーマンス計測はかなり標準が充実した言語になっています。
そして近年もそれに満足せず、Goを改善するための計測の仕組みがいくつも提案されています。
たとえばruntime/metrics
はdesign #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を改善していくためにはバグレポートだけでなく、テレメトリーが有効で必要であるという思想から推進されたパッケージです。
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 teamが開発しているツールはさまざまにあります。たとえばGoのコンパイラ自体もそうですし、 go doc
を始めとする go
ツールや govulncheck
などもそうです。
今後、こういったツールでも計装が行われるようになることでしょう。ただRuss Coxが記事でも書いている通り、コミュニティではopt-inが好まれていて、これはプライバシーに関する懸念の表れでもあります。導入を急いでせっかくの試みが頓挫しないよう、慎重に取り組んでいることがわかります。
Go teamが課題のトリアージをしやすくしたり、バグレポートに現れない情報を得やすくするためにも、これらのテレメトリーが広く認知されて使われるようになることを期待しています。
-
pprofが追加されたCLも、まだweekly releaseの最初期に行われています。 ↩︎
-
日本語で解説された記事があるので、興味がある人はぜひこちらも参照してください。 ↩︎
-
すでにgoplsから出されるプロンプトにしたがってopt-inしている方は以下の節をすでに実施しているかもしれません。 ↩︎
Discussion