1. 程式人生 > >Laravel Telescope:優雅的應用除錯工具

Laravel Telescope:優雅的應用除錯工具

文章轉自:laravel-china.org/topics/1901…
視訊教程:047. 優雅的應用除錯工具--laravel/telescope (5.7 新擴充套件)

Laravel Telescope 是由 Mohamed Said 和 Taylor Otwell 開源 的 Laravel 應用的除錯工具。

你可以使用 Composer 安裝到你的應用中。

安裝完 Telescope 後,你可以訪問 /telescope 來訪問該應用。

Telescope 能做什麼事?

如果你之前用過 Clockwork 或者 Laravel Debugbar ,那麼這兩款應用與 Telescope 進行對比的話就是純 UI 介面和重量級武器。

Telescope 由一系列監聽器組成,這些 "監聽器" 監聽每個進入應用的請求,不管是來自 HTTP 、命令列、任務排程還是佇列的。

這些監聽器捕獲這些請求以及其相關資料資訊 -- 例如資料庫查詢以及其執行時間,是否命中快取,事件觸發郵件觸發等等。

在它操作介面上有用於檢查以下各項的選項欄,每個選項欄都代表它的監聽器:

  • Requests
  • Commands
  • Schedule
  • Jobs
  • Exceptions
  • Logs
  • Dumps
  • Queries
  • Models
  • Events
  • Mail
  • Notifications
  • Cache
  • Redis

觀察者標籤

讓我們逐步瀏覽每個選項檢視觀察到的內容。每個選項都顯示一個列表頁面,然後您可以點選檢視指定專案的詳細資訊。

(HTTP) 請求

該選項允許您檢視進入應用程式的所有 HTTP 請求。您將能檢視所有 HTTP 請求以及每個請求的詳細資訊。

每個請求頁面還會顯示來自其他觀察者關於此請求相關的資料;例如,所有資料庫查詢以及它們花費時長;該請求已通過身份驗證使用者;等等。

命令列

命令選項列出已執行的所有命令及其退出程式碼。您還可以點選檢視所有引數,選項和相關內容。

計劃任務

列出已執行的計劃任務。在每個任務的詳細資訊頁面上,檢視他們的所有計劃資訊,例如他們的 cron 計劃(例如 * * * * *)。

任務

任務部分會列出所有執行過,和正在執行的任務。他和Horizon很類似,不過Horizon只支援Redis驅動,而且它不僅僅是UI,它還能和佇列溝通,看你佇列執行的情況。Telescope,簡簡單單只是一個UI,一個可以和任何佇列驅動玩在一起的UI。

在任務列表頁上,你會看到任務名,和它在哪個佇列和連線上執行,她的工作情況,和其所發生的經歷。

在任務細節頁面上,你會看到以上列舉的資料,以及:主機名, 他的FQCN,網路連線,佇列,嘗試次數,超時,還有標籤。

任務會自動給用過的Eloquent模型貼標籤 (栗子: App\Video:1) ,如果用過使用者模型,就會給使用者模型貼標籤,以此類推。

標籤
諸如請求,命令等專案,會自動被Telescope貼標籤 (舉栗子: 如果一個使用者發出了請求,他就自動會被貼上 Auth:1 if User 1 ; 如果你點選那個標籤, Telescope就只會顯示被貼上該標籤的專案)

如HTTP請求一般,你可以看到所有與此任務相關的資訊,比如資料庫查詢記錄,其觸發的其他任務,和任何生成的日誌。

不過,你如若出發了封閉函式,那麼你所見之資訊不是 App\Jobs\RenderVideo , 取而代之的是 Closure (web.php:43) .

新封閉函式佇列
Taylor寫了一個新的庫,加回了佇列封閉函式 (Laravel很多年前用過)。 這個庫的功能是,當你將一個模型放入封閉函式中,它只會存這個模型的ID,而不是整個物件。(原作者說的: 豈不妙哉?(反正佇列的類已經如此作為了),他很興奮)。
dispatch(function () use ($video) { // do stuff in a queued job // 做一些佇列的事情 });
這樣做以後,封閉函式會被序列化,並且有一個雜湊(Hash)值如影隨形。這樣可以防止你的程式碼在進入佇列事件後,程式碼被篡改,很是不好。現在有了雜湊,函式會先被檢查一遍,媽媽就不怕我的程式碼被篡改了。
該封閉函式會被序列化為一個長字串,加上他的雜湊(與簽名URL如出一轍)

Exceptions

該功能將記錄所有異常,並可檢視具體異常情況。介面使用選項卡的形式呈現,包括主機資訊,型別,請求,標籤,使用者身份驗證等。

除此之外也可看到異常在程式碼中的位置,使其高亮並展示上下程式碼段,且包含完整的堆疊追蹤。

你還可以從丟擲異常請求中獲取指向異常詳情頁面的連結。

注意:在眾多選項卡中,如果您在單個頁面上(例如,給定的異常頁面),你也可獲得指向生成該頁面的請求連結。

如果產生多次相同的異常,它們將在列表頁面上進行分組,但仍然可以深入檢視異常顯示頁面中的各個異常。

Logs

日誌項展示了日誌的基本資訊,級別和每條日誌項的記錄時間。

當你訪問日誌的單個詳細頁面時,你可以看到更多訊息,包含所有你傳遞給日誌的上下文資料(作為陣列)。

"比挖掘原始文字檔案棒一點。".

當你用陣列為你的日誌項傳遞上下文時,你可以檢視所有資料,檢視觸發它的請求,觸發的使用者。"比挖掘原始文字檔案棒一點。

Dump screen

"這是我最愛的功能之一"

如果你程式碼中使用 dump() 函式,而且你在 Telescope 中打開了 dump screen。你可以在 Telescope 中看到 dumps 並非來自你實際應用。這為你提供了資料的 dd() 樣式輸出,而不會弄亂您的正常頁面載入。每個 dump 還連結到生成它的請求。

如果你離開 dump screen,你所有的 dumps 會突然再次顯示到你的瀏覽器上。

Queries

列出了所有資料查詢相關資訊,就像 debug bar 一樣。如 消耗時常、完整查詢、請求觸發 等。

漂亮的格式化顯示。

可以在服務中配置慢查詢的邊界,一旦查詢查過其配置時間將會被標記,並配以紅色警告顯示。

注意:每個列表頁都有快捷方式和快速搜尋。搜尋標籤和其他內容。

Models

可以看到 查詢、更新、刪除事件;以及這些事件產生的變化 等。

事件

顯示所有事件的列表。可以看到哪些事件是通過標記廣播的;檢視所有偵聽器的列表,並深入瞭解呼叫的物件。

郵件

顯示傳送的所有電子郵件的列表;收件人是誰;什麼時候發的;是否還在佇列,然後什麼時候出隊的。可以看到電子郵件主題,當你深入研究它時,你也會看到諸如 MailTrap 的郵件預覽。

甚至可以下載原始的 .eml 檔案並在選定的客戶端中開啟。

Notifications

顯示所有通知,及其型別,等等。

無法預覽,因為有些通知是不可預覽的,假如是郵件通知,你就會看到它在列表中。

如果通知已進入佇列,還可以在 Jobs 的請求部分看到。有很多方式可以得到這些資料。

Cache

顯示快取命中、未命中和更新等。

顯示鍵,值,何時過期。可以看到觸發它的請求,也可以在請求頁面上看到該請求的所有快取命中/未命中。

Redis

跟上面的快取類似。

諸如花了多久時間,什麼時候發生,什麼時候發起請求等等。

Authenticated user

在任一選項卡的條目上獲取已驗證使用者的相關資訊。

Authorization

可在生產環境的 telescope 服務中,配置可訪問的郵件賬戶列表

在Gate 的 viewTelescope 中定義哪些使用者可以訪問

篩選

你可能不想在生產環境中把所有東西都存著,所以你可以在 Telescope 服務提供者中, 執行 Telescope::filter(function ($entry))

預設篩選器:

function ($entry) {
    if (local) { return true; }

    return $entry->isReportableException ||
        $entry->isfailedJob() ||
        $entry->isScheduledTask() ||
        $entry->hasMonitoredTag();
}

複製程式碼

但是你可以自由地修改它。

監控標籤:

點進雷達按鈕,宣告一個監控標籤。你可以在 UI 介面宣告一個 Auth:1 監視器。

生產環境中不會記錄請求,但是如果你有一個像 Auth:1 這樣的監視器,你就會看到所有的請求都被記錄下來,除非你取消監視。

NOTE: 如果你使用的是 Redis 佇列的話, Horizon 和 Telescope 能完美搭配。

修剪

在 Telescope 中任務排程會修剪掉過期的條目。你可以每晚都刪除超過__ 小時的東西。

這個也是在 config/telescope 中設定。

可以隨時啟用或棄用任意觀察者。 E.g. Watchers\CacheWatcher::class 就可以棄用。

還有一個 TELESCOPE_LIMIT 預設定義是 100 ;該選項的意義就是一次性進行 100 個查詢,100 次 Redis 查詢等。它們都可以在env中進行配置。

雜項

Telescope 可以在本地和生產環境中執行,並有內建授權和工具用來保護私有資料。它可從多角度訪問同類資料,具備一系列配置項,提供了健壯的標記和過濾功能。

考慮把它放在一個獨立的資料庫中。

Taylor 稍後就在 Twitter 上提到你可以新增過濾器從而確保私有資料不會被記錄下來。

你可以使用 Telescope::night() 來開啟夜晚模式(可能在某個服務提供者那裡?)

Q&A:

  • 資料存放在何處?隱藏在一個 StorageRepository 介面實現之後; 類似資料庫一樣運作在 Redis 上。你可以隨心所欲的實現它。這個介面中只有6-7 個方法。

  • 它能存多少資料?不是太多,因為生產環境幾乎會拋棄所有的東西,修剪下來,你一次只能儲存 100 個。

  • 我們能從 Slack 收到通知嗎?我們正在努力。

  • 我能退出 Bugsnag/etc.嗎? 可能不能。雖然它簡易且輕便,但並不意味著穩定健壯。小心火燭。

  • 我們能否按照時間戳進行過濾?暫時還不能,但是這個是開源專案,幫幫我們

  • 在系統引導階段會產生什麼影響?每次只會執行一個查詢。生產環境中不會頻繁地把所有東西都插入進去。你可以取消你不關心的監聽器。

  • 我們能在同一個UI中檢查多個應用嗎?可以;只需要在同一個資料庫中指向並記錄它們,然後考慮做標記/過濾, 這樣你就可以按需做區分了。

  • Laravel 的哪個版本能與之相容? 5.7.7+。