Laravel Telescope:優雅的應用調試工具

文章轉自:https://laravel-china.org/topics/19013\
視頻教程: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+。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章