[Debug log] SigNoz importing dashboard
事象: "Imort JSON" からダッシュボードを作成する際、ダッシュボード ID に空文字列を渡すとリンク先 URL が不正なダッシュボードリンクが作られ、削除もできなくなる
クラウド版を利用していて気付いたが、https://github.com/SigNoz/signoz/blob/381a4de88a7d4b33e63e6586770a7fdf5293a85e/deploy/docker/clickhouse-setup/docker-compose.yaml を利用してローカルでも再現した
clone したてで何もわからないが見ていく
とりあえず不正なデータが作られるとしたら "Import and Next" するときだろう
なので repo 内を "Import and Next" で検索する
マップがヒットしたのでこんどは import_and_next
で検索する
ハンドラを見つけた
多分ここだろうみたいな名前の関数を見つけた
createDashboard()
というそれっぽい関数を見つけたので見ていく
呼ばれ方見ると ...props
には ...dashboardData
が渡されつつ、それを url /dashboards
に POST っぽいのでこれはバックエンドの API を利用しているコード
不正なデータが作られるとしたらバックエンドの API の中なのでその実装を見たい
バックエンドのコードがどこにあるかわからない
とりあえず frontend/
と同じ階層には backend/
みたいなものはない
なのでインフラの構成を見る
frontend サービスが依存しているサービスを見つけた
alertmanager は alertmanager なんだろうからたぶんバックエンドは query-service と思われる
signoz のイメージであることがわかる
なのでたぶんこの repo に定義があるはず
query-service と思われるパス pkg/query-service/README.md
を見つけた
Query service is the interface between frontend and databases. It is written in Golang. It will have modules for all supported databases. Query service is responsible to:
parse the request from Frontend
create relevant Clickhouse queries (and all other supported database queries)
parse response from databases and handle error if any
clickhouse response in the format accepted by Frontend
ダッシュボード関連の API を探しているので下記に目を通す:
下記の部分で空文字列が想定されてない
考える必要があるのは下記:
- A. 再発を防止する
- B. 既存の問題を解消できるようにする
つまり
- A. ダッシュボード一覧画面に不正なテーブル行が作られないようにする
- 現時点でわからないこと:
- 当該事象が発生したとき、ダッシュボードが永続化されているのかどうか
- 画面のテーブル行は独立して永続化されるリソースなのか
- 現時点でわからないこと:
- B. ダッシュボード一覧画面に作られてしまった不正なテーブル行を削除できるようにする
- わからないこと
- 削除ロジック
- わからないこと
画面のテーブル行は独立して永続化されるリソースなのか
ここから調べてみる
ここが
ここなので、ダッシュボードリストの行は永続化されるリソースではなさそう
ListOfAllDashboard
という名前でインポートされている
おそらくダッシュボードの数ぶん iterate しているはず
ダッシュボードリストは下記で恐らく query-service から取得している
で、いま不正なダッシュボードリスト行ができているということは、恐らく ID が不正なダッシュボードは永続化されているのだと思う。
つまり
当該事象が発生したとき、ダッシュボードが永続化されているのかどうか
は「永続化されている」と思われる
恐らく ID が不正なダッシュボードは永続化されているのだと思う
永続化時のマッピングがどうなっているかあとで確認する
ダッシュボードリスト行の削除は下記のあたり
永続化時のマッピングがどうなっているかあとで確認
これを調べないと修正方法がわからない
ダッシュボードへのリンクは下記のあたり
永続化時のマッピングがどうなっているかあとで確認
これを調べないと修正方法がわからない
uuid が空文字列なら失敗しそうだがどうなのだろう(いや、少なくとも 1 回は成功しているからこの事象が起きている)
試してみた
- 空文字列で登録: unique 制約違反で失敗
- 不正な uuid: 成功
とりあえずダッシュボード ID のバリデーションを強化したほうがよさそう
テスト書いて状況把握する