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

文章轉自: https://laravel-china.org/topics/19013\
視頻教程: 047. 優雅的應用調試工具--laravel/telescope (5.7 新擴展)

Laravel Telescope 是由 Mohamed Said 和 Taylor Otwell 開源 的 Laravel 應用的調試工具。php

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

安裝完 Telescope 後,你能夠訪問 /telescope 來訪問該應用。git

Telescope 能作什麼事?

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

Telescope 由一系列監聽器組成,這些 "監聽器" 監聽每一個進入應用的請求,不論是來自 HTTP 、命令行、任務調度仍是隊列的。web

這些監聽器捕獲這些請求以及其相關數據信息 -- 例如數據庫查詢以及其執行時間,是否命中緩存,事件觸發郵件觸發等等。數據庫

在它操做界面上有用於檢查如下各項的選項欄,每一個選項欄都表明它的監聽器:數組

  • 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+。
相關文章
相關標籤/搜索