Closed11

[Debug log] SigNoz importing dashboard

rinrin

clone したてで何もわからないが見ていく

とりあえず不正なデータが作られるとしたら "Import and Next" するときだろう

なので repo 内を "Import and Next" で検索する

https://github.com/SigNoz/signoz/blob/381a4de88a7d4b33e63e6586770a7fdf5293a85e/frontend/public/locales/en/dashboard.json#L13

マップがヒットしたのでこんどは import_and_next で検索する

https://github.com/SigNoz/signoz/blob/381a4de88a7d4b33e63e6586770a7fdf5293a85e/frontend/src/container/ListOfDashboard/ImportJSON/index.tsx#L232

ハンドラを見つけた
https://github.com/SigNoz/signoz/blob/381a4de88a7d4b33e63e6586770a7fdf5293a85e/frontend/src/container/ListOfDashboard/ImportJSON/index.tsx#L78-L94

多分ここだろうみたいな名前の関数を見つけた
https://github.com/SigNoz/signoz/blob/381a4de88a7d4b33e63e6586770a7fdf5293a85e/frontend/src/container/ListOfDashboard/ImportJSON/index.tsx#L91-L94

rinrin

createDashboard() というそれっぽい関数を見つけたので見ていく

https://github.com/SigNoz/signoz/blob/381a4de88a7d4b33e63e6586770a7fdf5293a85e/frontend/src/api/dashboard/create.ts#L7-L25

呼ばれ方見ると ...props には ...dashboardData が渡されつつ、それを url /dashboards に POST っぽいのでこれはバックエンドの API を利用しているコード

不正なデータが作られるとしたらバックエンドの API の中なのでその実装を見たい

バックエンドのコードがどこにあるかわからない

とりあえず frontend/ と同じ階層には backend/ みたいなものはない

なのでインフラの構成を見る

frontend サービスが依存しているサービスを見つけた
https://github.com/SigNoz/signoz/blob/381a4de88a7d4b33e63e6586770a7fdf5293a85e/deploy/docker/clickhouse-setup/docker-compose.yaml#L205-L211

alertmanager は alertmanager なんだろうからたぶんバックエンドは query-service と思われる

signoz のイメージであることがわかる
https://github.com/SigNoz/signoz/blob/381a4de88a7d4b33e63e6586770a7fdf5293a85e/deploy/docker/clickhouse-setup/docker-compose.yaml#L166-L173

なのでたぶんこの repo に定義があるはず

rinrin

query-service と思われるパス pkg/query-service/README.md を見つけた

https://github.com/SigNoz/signoz/blob/381a4de88a7d4b33e63e6586770a7fdf5293a85e/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 を探しているので下記に目を通す:

https://github.com/SigNoz/signoz/blob/381a4de88a7d4b33e63e6586770a7fdf5293a85e/pkg/query-service/model/dashboards.go

https://github.com/SigNoz/signoz/blob/381a4de88a7d4b33e63e6586770a7fdf5293a85e/pkg/query-service/app/dashboards/model.go

下記の部分で空文字列が想定されてない
https://github.com/SigNoz/signoz/blob/381a4de88a7d4b33e63e6586770a7fdf5293a85e/pkg/query-service/app/dashboards/model.go#L209-L211

rinrin

考える必要があるのは下記:

  • A. 再発を防止する
  • B. 既存の問題を解消できるようにする

つまり

  • A. ダッシュボード一覧画面に不正なテーブル行が作られないようにする
    • 現時点でわからないこと:
      • 当該事象が発生したとき、ダッシュボードが永続化されているのかどうか
      • 画面のテーブル行は独立して永続化されるリソースなのか
  • B. ダッシュボード一覧画面に作られてしまった不正なテーブル行を削除できるようにする
    • わからないこと
      • 削除ロジック
rinrin

画面のテーブル行は独立して永続化されるリソースなのか

ここから調べてみる
https://github.com/SigNoz/signoz/blob/b444c1e6b1d309d5ffa4b5821fead1c82a4503f5/frontend/src/pages/DashboardsListPage/DashboardsListPage.tsx


ここが
https://github.com/SigNoz/signoz/blob/b444c1e6b1d309d5ffa4b5821fead1c82a4503f5/frontend/src/container/ListOfDashboard/DashboardsList.tsx#L453-L454
ここなので、ダッシュボードリストの行は永続化されるリソースではなさそう

rinrin

おそらくダッシュボードの数ぶん iterate しているはず
https://github.com/SigNoz/signoz/blob/b444c1e6b1d309d5ffa4b5821fead1c82a4503f5/frontend/src/container/ListOfDashboard/DashboardsList.tsx#L175

ダッシュボードリストは下記で恐らく query-service から取得している
https://github.com/SigNoz/signoz/blob/b444c1e6b1d309d5ffa4b5821fead1c82a4503f5/frontend/src/hooks/dashboard/useGetAllDashboard.tsx#L6-L10

で、いま不正なダッシュボードリスト行ができているということは、恐らく ID が不正なダッシュボードは永続化されているのだと思う。

つまり

当該事象が発生したとき、ダッシュボードが永続化されているのかどうか

は「永続化されている」と思われる

rinrin

恐らく ID が不正なダッシュボードは永続化されているのだと思う

永続化時のマッピングがどうなっているかあとで確認する

rinrin

永続化時のマッピングがどうなっているかあとで確認

これを調べないと修正方法がわからない

https://github.com/SigNoz/signoz/blob/381a4de88a7d4b33e63e6586770a7fdf5293a85e/pkg/query-service/app/dashboards/model.go#L227-L232

uuid が空文字列なら失敗しそうだがどうなのだろう(いや、少なくとも 1 回は成功しているからこの事象が起きている)

試してみた

  • 空文字列で登録: unique 制約違反で失敗
  • 不正な uuid: 成功

とりあえずダッシュボード ID のバリデーションを強化したほうがよさそう

テスト書いて状況把握する

このスクラップは9日前にクローズされました