跳至內容

遙測

Tuist 提供三種互補的可觀測性訊號:指標(Prometheus)、追蹤(OpenTelemetry),以及日誌(相容 Loki)。三者皆為選用項目,可獨立啟用。

分散式追蹤(OpenTelemetry)#

Tuist 支援使用 OpenTelemetry 進行分散式追蹤。啟用後,伺服器會針對 HTTP 請求(Phoenix 與 Bandit)、資料庫查詢(Ecto)、外發 HTTP 呼叫(Finch),以及 Broadway 訊息處理發出追蹤資料。這些追蹤資料能協助你了解請求延遲、找出緩慢查詢,並跨服務追蹤請求。

設定#

設定以下環境變數以啟用追蹤匯出:

環境變數說明必填預設值範例
TUIST_OTEL_EXPORTER_OTLP_ENDPOINTOpenTelemetry Collector 的 gRPC 端點(例如 Grafana Alloy、Jaeger,或任何相容 OTLP 的收集器)否http://localhost:4317

若未設定此變數,追蹤功能將停用且不會產生額外負擔。

已插樁的程式庫#

啟用追蹤時,下列程式庫會自動進行插樁:

  • Bandit — HTTP 伺服器連線跨度
  • Phoenix — 請求生命週期跨度(控制器動作、LiveView)
  • Ecto — 帶有查詢中繼資料的資料庫查詢跨度
  • Finch — 外發 HTTP 用戶端請求跨度
  • Broadway — 訊息處理管線跨度

使用 Grafana Alloy 的範例設定#

若你使用 Grafana Alloy 作為收集器,請將其設定為接收 OTLP 追蹤資料,並轉送至你的追蹤後端(例如 Grafana Cloud Tempo):

plaintext
otelcol.receiver.otlp "default" {
grpc {
endpoint = "0.0.0.0:4317"
}
output {
traces = [otelcol.exporter.otlp.your_backend.input]
}
}

接著將 TUIST_OTEL_EXPORTER_OTLP_ENDPOINT 設為指向 Alloy 執行個體,例如 http://alloy:4317。

日誌轉送(Loki)#

Tuist 可將應用程式日誌轉送至相容 Loki 的端點。這讓你得以將日誌與指標及追蹤集中管理,獲得完整的可觀測性視圖。日誌會透過 Loki HTTP Push API(/loki/api/v1/push)推送,並包含 app、env 與 level 標籤。

設定#

環境變數說明必填預設值範例
TUIST_LOKI_URL相容 Loki 之 Push API 端點的基礎 URL否http://localhost:3100

若未設定此變數,日誌轉送功能將停用。

使用 Grafana Alloy 的範例設定#

Grafana Alloy 可使用其 loki.source.api 元件擔任本機日誌中繼:

plaintext
loki.source.api "default" {
http {
listen_address = "0.0.0.0"
listen_port = 3100
}
forward_to = [loki.write.your_backend.receiver]
use_incoming_timestamp = true
}
loki.write "your_backend" {
endpoint {
url = "https://your-loki-instance/loki/api/v1/push"
basic_auth {
username = "your-username"
password = "your-password"
}
}
}

接著設定 TUIST_LOKI_URL=http://alloy:3100。

若 Loki 執行個體公開了 Push API,你也可以將 TUIST_LOKI_URL 直接指向該執行個體。

Prometheus 指標#

你可以使用 Prometheus 與像是 Grafana 的視覺化工具,匯入 Tuist 伺服器收集的指標,打造符合需求的自訂儀表板。Prometheus 指標會透過連接埠 9091 上的 /metrics 端點提供。Prometheus 的 scrape_interval 應設為低於 10_000 秒(我們建議設為 30 秒,以在可觀測性與指標匯入成本之間取得平衡)。

真實使用者監控#

Tuist 可使用內建於所提供 JavaScript 中的 Grafana Faro Web SDK,回報行銷網站、文件與儀表板的瀏覽器效能。它會擷取核心網頁指標(包含最大內容繪製)、未捕捉的錯誤與頁面瀏覽量,並將這些資料發布至你執行的 Faro 接收器 — 例如 Grafana Alloy 中的 faro.receiver 元件,該元件會將資料轉送至 Loki 與 Tempo。

設定#

環境變數說明必填預設值範例
TUIST_FARO_COLLECTOR_URL瀏覽器發布 Faro 負載的目標 URL否/-/faro
Note

只有在設定 TUIST_FARO_COLLECTOR_URL 時才會啟用真實使用者監控。若未設定,就不會收集瀏覽器遙測資料,也不會載入任何第三方指令碼。

使用同源路徑(例如 /-/faro)可避免跨來源請求,並保持瀏覽器的內容安全政策不變。請透過你的入口閘道將其指向你的 Faro 接收器。

收集的資料#

  • 網頁指標:LCP、CLS、INP、FCP 與 TTFB,由瀏覽器自動擷取
  • 頁面瀏覽:在載入與 Phoenix LiveView 導航時記錄
  • 視圖:每個負載都帶有產生該負載的區段 — marketing、docs、dashboard 或 api-docs
  • 錯誤:未捕捉的例外狀況與未處理的 Promise 拒絕

隱私考量#

  • 不附加使用者身分:負載中不包含使用者 ID、電子郵件或帳號
  • 工作階段不會在不同造訪間持久化,因此不會寫入任何資料到瀏覽器儲存空間
  • 主控台擷取已關閉,因此應用程式日誌輸出絕不會從瀏覽器送出

Elixir 指標#

預設情況下,我們會納入 Elixir 執行階段、BEAM、Elixir 以及部分所用程式庫的指標。以下是你可見的部分指標:

我們建議查閱這些頁面,以了解可用指標及其使用方法。

執行次數指標#

一組與 Tuist 執行次數相關的指標。

tuist_runs_total(計數器)#

Tuist 執行次數的總數。

標籤#

標籤說明
name已執行的 tuist 指令名稱,例如 build、test 等。
is_ci布林值,指出執行者是 CI 還是開發人員的機器。
statussuccess 時為 0,failure 時為 1。

tuist_runs_duration_milliseconds(直方圖)#

每次 tuist 執行的總持續時間(毫秒)。

標籤#

標籤說明
name已執行的 tuist 指令名稱,例如 build、test 等。
is_ci布林值,指出執行者是 CI 還是開發人員的機器。
statussuccess 時為 0,failure 時為 1。

快取指標#

一組與 Tuist 快取相關的指標。

tuist_cache_events_total(計數器)#

二元快取事件的總數。

標籤#

標籤說明
event_type可以是 local_hit、remote_hit 或 miss。

tuist_cache_uploads_total(計數器)#

上傳至二元快取的次數。

tuist_cache_uploaded_bytes(總和)#

上傳至二元快取的位元組數。

tuist_cache_downloads_total(計數器)#

從二元快取下載的次數。

tuist_cache_downloaded_bytes(總和)#

從二元快取下載的位元組數。


預覽指標#

一組與預覽功能相關的指標。

tuist_previews_uploads_total(總和)#

上傳的預覽總數。

tuist_previews_downloads_total(總和)#

下載的預覽總數。


儲存指標#

一組與遠端儲存(例如 S3)中構件儲存相關的指標。

Tip

這些指標有助於了解儲存操作的效能並識別潛在瓶頸。

tuist_storage_get_object_size_size_bytes(直方圖)#

從遠端儲存抓取的物件大小(位元組)。

標籤#

標籤說明
object_key遠端儲存中物件的查詢鍵。

tuist_storage_get_object_size_duration_miliseconds(直方圖)#

從遠端儲存抓取物件大小的持續時間(毫秒)。

標籤#

標籤說明
object_key遠端儲存中物件的查詢鍵。

tuist_storage_get_object_size_count(計數器)#

從遠端儲存抓取物件大小的次數。

標籤#

標籤說明
object_key遠端儲存中物件的查詢鍵。

tuist_storage_delete_all_objects_duration_milliseconds(直方圖)#

從遠端儲存刪除所有物件的持續時間(毫秒)。

標籤#

標籤說明
project_slug正在刪除其物件之專案的專案 slug。

tuist_storage_delete_all_objects_count(計數器)#

從遠端儲存刪除所有專案物件的次數。

標籤#

標籤說明
project_slug正在刪除其物件之專案的專案 slug。

tuist_storage_multipart_start_upload_duration_milliseconds(直方圖)#

開始上傳至遠端儲存的持續時間(毫秒)。

標籤#

標籤說明
object_key遠端儲存中物件的查詢鍵。

tuist_storage_multipart_start_upload_duration_count(計數器)#

開始上傳至遠端儲存的次數。

標籤#

標籤說明
object_key遠端儲存中物件的查詢鍵。

tuist_storage_get_object_as_string_duration_milliseconds(直方圖)#

從遠端儲存以字串形式抓取物件的持續時間(毫秒)。

標籤#

標籤說明
object_key遠端儲存中物件的查詢鍵。

tuist_storage_get_object_as_string_count(計數)#

從遠端儲存以字串形式抓取物件的次數。

標籤#

標籤說明
object_key遠端儲存中物件的查詢鍵。

tuist_storage_check_object_existence_duration_milliseconds(直方圖)#

檢查遠端儲存中物件是否存在的持續時間(毫秒)。

標籤#

標籤說明
object_key遠端儲存中物件的查詢鍵。

tuist_storage_check_object_existence_count(計數)#

檢查遠端儲存中物件是否存在的次數。

標籤#

標籤說明
object_key遠端儲存中物件的查詢鍵。

tuist_storage_generate_download_presigned_url_duration_milliseconds(直方圖)#

為遠端儲存中的物件產生下載預簽署 URL 的持續時間(毫秒)。

標籤#

標籤說明
object_key遠端儲存中物件的查詢鍵。

tuist_storage_generate_download_presigned_url_count(計數)#

為遠端儲存中的物件產生下載預簽署 URL 的次數。

標籤#

標籤說明
object_key遠端儲存中物件的查詢鍵。

tuist_storage_multipart_generate_upload_part_presigned_url_duration_milliseconds(直方圖)#

為遠端儲存中的物件產生分段上傳預簽署 URL 的持續時間(毫秒)。

標籤#

標籤說明
object_key遠端儲存中物件的查詢鍵。
part_number正在上傳之物件的分段編號。
upload_id分段上傳的上傳 ID。

tuist_storage_multipart_generate_upload_part_presigned_url_count(計數)#

為遠端儲存中的物件產生分段上傳預簽署 URL 的次數。

標籤#

標籤說明
object_key遠端儲存中物件的查詢鍵。
part_number正在上傳之物件的分段編號。
upload_id分段上傳的上傳 ID。

tuist_storage_multipart_complete_upload_duration_milliseconds(直方圖)#

完成上傳至遠端儲存的持續時間(毫秒)。

標籤#

標籤說明
object_key遠端儲存中物件的查詢鍵。
upload_id分段上傳的上傳 ID。

tuist_storage_multipart_complete_upload_count(計數)#

完成上傳至遠端儲存的總次數。

標籤#

標籤說明
object_key遠端儲存中物件的查詢鍵。
upload_id分段上傳的上傳 ID。

驗證指標#

一組與驗證相關的指標。

tuist_authentication_token_refresh_error_total(計數器)#

權杖刷新錯誤的總數。

標籤#

標籤說明
cli_version遇到錯誤的 Tuist CLI 版本。
reason權杖刷新錯誤的原因,例如 invalid_token_type 或 invalid_token。

專案指標#

一組與專案相關的指標。

tuist_projects_total(最新值)#

專案總數。


帳號指標#

一組與帳號(使用者和組織)相關的指標。

tuist_accounts_organizations_total(最新值)#

組織總數。

tuist_accounts_users_total(最新值)#

使用者總數。

資料庫指標#

一組與資料庫連線相關的指標。

儲存庫集區指標每 100 毫秒在內部採樣一次,然後透過 /metrics 公開給 Prometheus。下方的 last_value 指標顯示抓取時的最新集區狀態。後方的壓力指標是從這些 100 毫秒樣本衍生出的總和,即使在下一次抓取前已恢復,也更容易察覺短暫的飽和現象。

tuist_repo_pool_checkout_queue_length(最新值)#

處於佇列中等待分配至資料庫連線的資料庫查詢數量。

標籤#

標籤說明
repo發出該指標的儲存庫,例如 postgres、clickhouse_read 或 clickhouse_write。
database底層資料庫類型,例如 postgres 或 clickhouse。

tuist_repo_pool_ready_conn_count(最新值)#

準備好分配給資料庫查詢的資料庫連線數量。

標籤#

標籤說明
repo發出該指標的儲存庫,例如 postgres、clickhouse_read 或 clickhouse_write。
database底層資料庫類型,例如 postgres 或 clickhouse。

tuist_repo_pool_size(最新值)#

集區中設定的連線數量。

標籤#

標籤說明
repo發出該指標的儲存庫,例如 postgres、clickhouse_read 或 clickhouse_write。
database底層資料庫類型,例如 postgres 或 clickhouse。

tuist_repo_pool_checkout_queue_total_samples_sum(總和)#

執行的儲存庫集區輪詢總數(每次輪詢遞增 1)。在計算忙碌或飢餓百分比時,請將此作為分母:rate(busy_samples) / rate(total_samples) 或 rate(starved_samples) / rate(total_samples)。

標籤#

標籤說明
repo發出該指標的儲存庫,例如 postgres、clickhouse_read 或 clickhouse_write。
database底層資料庫類型,例如 postgres 或 clickhouse。

tuist_repo_pool_checkout_queue_observed_sum(總和)#

在儲存庫集區輪詢中觀察到的排隊檢出請求總和。這有助於偵測僅憑最新佇列長度樣本可能無法察覺的短暫集區爭用爆發。

標籤#

標籤說明
repo發出該指標的儲存庫,例如 postgres、clickhouse_read 或 clickhouse_write。
database底層資料庫類型,例如 postgres 或 clickhouse。

tuist_repo_pool_checkout_queue_busy_samples_sum(總和)#

儲存庫集區輪詢中,至少有一個資料庫檢出請求在佇列中等待的次數。

標籤#

標籤說明
repo發出該指標的儲存庫,例如 postgres、clickhouse_read 或 clickhouse_write。
database底層資料庫類型,例如 postgres 或 clickhouse。

tuist_repo_pool_checkout_queue_starved_samples_sum(總和)#

儲存庫集區輪詢中,檢出請求排隊且無可用就緒連線的次數。此處持續增加通常表示集區已飽和。

標籤#

標籤說明
repo發出該指標的儲存庫,例如 postgres、clickhouse_read 或 clickhouse_write。
database底層資料庫類型,例如 postgres 或 clickhouse。

tuist_repo_pool_db_connection_connected(計數器)#

已建立至資料庫的連線數量。

tuist_repo_pool_db_connection_disconnected(計數器)#

已從資料庫斷開的連線數量。

標籤#

標籤說明
tag識別發出儲存庫的 DBConnection 監聽器標籤。

HTTP 指標#

一組與 Tuist 透過 HTTP 與其他服務互動相關的指標。

tuist_http_request_count(計數器)#

傳出的 HTTP 請求數量。

tuist_http_request_duration_nanosecond_sum(總和)#

傳出請求持續時間的總和(包含等待分配至連線的時間)。

tuist_http_request_duration_nanosecond_bucket(分佈)#

傳出請求持續時間的分佈(包含等待分配至連線的時間)。

tuist_http_queue_count(計數器)#

已從集區中取回的請求數量。

tuist_http_queue_duration_nanoseconds_sum(總和)#

從集區中取回連線所需的時間。

tuist_http_queue_idle_time_nanoseconds_sum(總和)#

連線閒置等待被取回的時間。

tuist_http_queue_duration_nanoseconds_bucket(分佈)#

從集區中取回連線所需的時間。

tuist_http_queue_idle_time_nanoseconds_bucket(分佈)#

連線閒置等待被取回的時間。

tuist_http_connection_count(計數器)#

已建立的連線數量。

tuist_http_connection_duration_nanoseconds_sum(總和)#

與主機建立連線所需的時間。

tuist_http_connection_duration_nanoseconds_bucket(分佈)#

與主機建立連線所需時間的分佈。

tuist_http_send_count(計數器)#

已從集區分配至連線並發送的請求數量。

tuist_http_send_duration_nanoseconds_sum(總和)#

從集區分配至連線後,請求完成所需的時間。

tuist_http_send_duration_nanoseconds_bucket(分佈)#

從集區分配至連線後,請求完成所需時間的分佈。

tuist_http_receive_count(計數器)#

已從發送請求中收到的回應數量。

tuist_http_receive_duration_nanoseconds_sum(總和)#

接收回應所花費的時間。

tuist_http_receive_duration_nanoseconds_bucket(分佈)#

接收回應所花費時間的分佈。

tuist_http_queue_available_connections(最新值)#

佇列中可用的連線數量。

tuist_http_queue_in_use_connections(最新值)#

使用中佇列連線的數量。