遙測
Tuist 提供三種互補的可觀測性訊號:指標(Prometheus)、追蹤(OpenTelemetry),以及日誌(相容 Loki)。三者皆為選用項目,可獨立啟用。
分散式追蹤(OpenTelemetry)#
Tuist 支援使用 OpenTelemetry 進行分散式追蹤。啟用後,伺服器會針對 HTTP 請求(Phoenix 與 Bandit)、資料庫查詢(Ecto)、外發 HTTP 呼叫(Finch),以及 Broadway 訊息處理發出追蹤資料。這些追蹤資料能協助你了解請求延遲、找出緩慢查詢,並跨服務追蹤請求。
設定#
設定以下環境變數以啟用追蹤匯出:
| 環境變數 | 說明 | 必填 | 預設值 | 範例 |
|---|---|---|---|---|
TUIST_OTEL_EXPORTER_OTLP_ENDPOINT | OpenTelemetry 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):
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 元件擔任本機日誌中繼:
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 |
只有在設定 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 還是開發人員的機器。 |
status | success 時為 0,failure 時為 1。 |
tuist_runs_duration_milliseconds(直方圖)#
每次 tuist 執行的總持續時間(毫秒)。
標籤#
| 標籤 | 說明 |
|---|---|
name | 已執行的 tuist 指令名稱,例如 build、test 等。 |
is_ci | 布林值,指出執行者是 CI 還是開發人員的機器。 |
status | success 時為 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)中構件儲存相關的指標。
這些指標有助於了解儲存操作的效能並識別潛在瓶頸。
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(最新值)#
使用中佇列連線的數量。