Laravel Telescope:優(yōu)雅的應(yīng)用調(diào)試工具

文章轉(zhuǎn)自:https://laravel-china.org/topics/19013
視頻教程:047. 優(yōu)雅的應(yīng)用調(diào)試工具--laravel/telescope (5.7 新擴(kuò)展)

Laravel Telescope 是由 Mohamed Said 和 Taylor Otwell 開源 的 Laravel 應(yīng)用的調(diào)試工具。

你可以使用 Composer 安裝到你的應(yīng)用中。

安裝完 Telescope 后,你可以訪問 /telescope 來訪問該應(yīng)用。

Telescope 能做什么事?

如果你之前用過 Clockwork 或者 Laravel Debugbar ,那么這兩款應(yīng)用與 Telescope 進(jìn)行對比的話就是純 UI 界面和重量級武器。

Telescope 由一系列監(jiān)聽器組成,這些 “監(jiān)聽器” 監(jiān)聽每個進(jìn)入應(yīng)用的請求,不管是來自 HTTP 、命令行、任務(wù)調(diào)度還是隊列的。

這些監(jiān)聽器捕獲這些請求以及其相關(guān)數(shù)據(jù)信息 -- 例如數(shù)據(jù)庫查詢以及其執(zhí)行時間,是否命中緩存,事件觸發(fā)郵件觸發(fā)等等。

在它操作界面上有用于檢查以下各項的選項欄,每個選項欄都代表它的監(jiān)聽器:

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

觀察者標(biāo)簽

讓我們逐步瀏覽每個選項查看觀察到的內(nèi)容。每個選項都顯示一個列表頁面,然后您可以點擊查看指定項目的詳細(xì)信息。

(HTTP) 請求

<figure style="margin: 1em 0px;">
image

</figure>

該選項允許您查看進(jìn)入應(yīng)用程序的所有 HTTP 請求。您將能查看所有 HTTP 請求以及每個請求的詳細(xì)信息。

<figure style="margin: 1em 0px;">
image

</figure>

<figure style="margin: 1em 0px;">
image

</figure>

<figure style="margin: 1em 0px;">
image

</figure>

每個請求頁面還會顯示來自其他觀察者關(guān)于此請求相關(guān)的數(shù)據(jù);例如,所有數(shù)據(jù)庫查詢以及它們花費時長;該請求已通過身份驗證用戶;等等。

<figure style="margin: 1em 0px;">
image

</figure>

命令行

<figure style="margin: 1em 0px;">
image

</figure>

命令選項列出已運行的所有命令及其退出代碼。您還可以點擊查看所有參數(shù),選項和相關(guān)內(nèi)容。

<figure style="margin: 1em 0px;">
image

</figure>

計劃任務(wù)

列出已運行的計劃任務(wù)。在每個任務(wù)的詳細(xì)信息頁面上,查看他們的所有計劃信息,例如他們的 cron 計劃(例如 * * * * *)。

<figure style="margin: 1em 0px;">
image

</figure>

任務(wù)

<figure style="margin: 1em 0px;">
image

</figure>

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

<figure style="margin: 1em 0px;">
image

</figure>

在任務(wù)列表頁上,你會看到任務(wù)名,和它在哪個隊列和連接上運行,她的工作情況,和其所發(fā)生的經(jīng)歷。

在任務(wù)細(xì)節(jié)頁面上,你會看到以上列舉的數(shù)據(jù),以及:主機(jī)名, 他的FQCN,網(wǎng)絡(luò)連接,隊列,嘗試次數(shù),超時,還有標(biāo)簽。

<figure style="margin: 1em 0px;">
image

</figure>

任務(wù)會自動給用過的Eloquent模型貼標(biāo)簽 (栗子: App\Video:1) ,如果用過用戶模型,就會給用戶模型貼標(biāo)簽,以此類推。

標(biāo)簽
諸如請求,命令等項目,會自動被Telescope貼標(biāo)簽 (舉栗子: 如果一個用戶發(fā)出了請求,他就自動會被貼上 Auth:1 if User 1 ; 如果你點擊那個標(biāo)簽, Telescope就只會顯示被貼上該標(biāo)簽的項目)

如HTTP請求一般,你可以看到所有與此任務(wù)相關(guān)的信息,比如數(shù)據(jù)庫查詢記錄,其觸發(fā)的其他任務(wù),和任何生成的日志。

不過,你如若出發(fā)了封閉函數(shù),那么你所見之信息不是 App\Jobs\RenderVideo , 取而代之的是 Closure (web.php:43) .

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

Exceptions

<figure style="margin: 1em 0px;">
image

</figure>

該功能將記錄所有異常,并可查看具體異常情況。界面使用選項卡的形式呈現(xiàn),包括主機(jī)信息,類型,請求,標(biāo)簽,用戶身份驗證等。

<figure style="margin: 1em 0px;">
image

</figure>

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

<figure style="margin: 1em 0px;">
image

</figure>

<figure style="margin: 1em 0px;">
image

</figure>

你還可以從拋出異常請求中獲取指向異常詳情頁面的鏈接。

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

如果產(chǎn)生多次相同的異常,它們將在列表頁面上進(jìn)行分組,但仍然可以深入查看異常顯示頁面中的各個異常。

Logs

日志項展示了日志的基本信息,級別和每條日志項的記錄時間。

<figure style="margin: 1em 0px;">
image

</figure>

當(dāng)你訪問日志的單個詳細(xì)頁面時,你可以看到更多消息,包含所有你傳遞給日志的上下文數(shù)據(jù)(作為數(shù)組)。

"比挖掘原始文本文件棒一點。".

當(dāng)你用數(shù)組為你的日志項傳遞上下文時,你可以查看所有數(shù)據(jù),查看觸發(fā)它的請求,觸發(fā)的用戶。”比挖掘原始文本文件棒一點。

<figure style="margin: 1em 0px;">
image

</figure>

Dump screen

<figure style="margin: 1em 0px;">
image

</figure>

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

如果你代碼中使用 dump() 函數(shù),而且你在 Telescope 中打開了 dump screen。你可以在 Telescope 中看到 dumps 并非來自你實際應(yīng)用。這為你提供了數(shù)據(jù)的 dd() 樣式輸出,而不會弄亂您的正常頁面加載。每個 dump 還鏈接到生成它的請求。

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

Queries

<figure style="margin: 1em 0px;">
image

</figure>

列出了所有數(shù)據(jù)查詢相關(guān)信息,就像 debug bar 一樣。如 消耗時常、完整查詢、請求觸發(fā) 等。

漂亮的格式化顯示。

<figure style="margin: 1em 0px;">
image

</figure>

可以在服務(wù)中配置慢查詢的邊界,一旦查詢查過其配置時間將會被標(biāo)記,并配以紅色警告顯示。

注意:每個列表頁都有快捷方式和快速搜索。搜索標(biāo)簽和其他內(nèi)容。

Models

<figure style="margin: 1em 0px;">
image

</figure>

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

<figure style="margin: 1em 0px;">
image

</figure>

事件

<figure style="margin: 1em 0px;">
image

</figure>

顯示所有事件的列表。可以看到哪些事件是通過標(biāo)記廣播的;查看所有偵聽器的列表,并深入了解調(diào)用的對象。

<figure style="margin: 1em 0px;">
image

</figure>

郵件

<figure style="margin: 1em 0px;">
image

</figure>

顯示發(fā)送的所有電子郵件的列表;收件人是誰;什么時候發(fā)的;是否還在隊列,然后什么時候出隊的??梢钥吹诫娮余]件主題,當(dāng)你深入研究它時,你也會看到諸如 MailTrap 的郵件預(yù)覽。

<figure style="margin: 1em 0px;">
image

</figure>

甚至可以下載原始的 .eml 文件并在選定的客戶端中打開。

Notifications

<figure style="margin: 1em 0px;">
image

</figure>

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

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

如果通知已進(jìn)入隊列,還可以在 Jobs 的請求部分看到。有很多方式可以得到這些數(shù)據(jù)。

Cache

顯示緩存命中、未命中和更新等。

顯示鍵,值,何時過期??梢钥吹接|發(fā)它的請求,也可以在請求頁面上看到該請求的所有緩存命中/未命中。

<figure style="margin: 1em 0px;">
image

</figure>

Redis

跟上面的緩存類似。

諸如花了多久時間,什么時候發(fā)生,什么時候發(fā)起請求等等。

Authenticated user

在任一選項卡的條目上獲取已驗證用戶的相關(guān)信息。

<figure style="margin: 1em 0px;">
image

</figure>

Authorization

可在生產(chǎn)環(huán)境的 telescope 服務(wù)中,配置可訪問的郵件賬戶列表

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

<figure style="margin: 1em 0px;">
image

</figure>

篩選

你可能不想在生產(chǎn)環(huán)境中把所有東西都存著,所以你可以在 Telescope 服務(wù)提供者中, 運行 Telescope::filter(function ($entry))。

默認(rèn)篩選器:

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

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

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

監(jiān)控標(biāo)簽:

點進(jìn)雷達(dá)按鈕,聲明一個監(jiān)控標(biāo)簽。你可以在 UI 界面聲明一個 Auth:1 監(jiān)視器。

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

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

修剪

在 Telescope 中任務(wù)調(diào)度會修剪掉過期的條目。你可以每晚都刪除超過__ 小時的東西。

這個也是在 config/telescope 中設(shè)置。

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

還有一個 TELESCOPE_LIMIT 默認(rèn)定義是 100 ;該選項的意義就是一次性進(jìn)行 100 個查詢,100 次 Redis 查詢等。它們都可以在env中進(jìn)行配置。

雜項

Telescope 可以在本地和生產(chǎn)環(huán)境中運行,并有內(nèi)建授權(quán)和工具用來保護(hù)私有數(shù)據(jù)。它可從多角度訪問同類數(shù)據(jù),具備一系列配置項,提供了健壯的標(biāo)記和過濾功能。

考慮把它放在一個獨立的數(shù)據(jù)庫中。

Taylor 稍后就在 Twitter 上提到你可以添加過濾器從而確保私有數(shù)據(jù)不會被記錄下來。

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

<figure style="margin: 1em 0px;">
image

</figure>

Q&A:

  • 數(shù)據(jù)存放在何處?隱藏在一個 StorageRepository 接口實現(xiàn)之后; 類似數(shù)據(jù)庫一樣運作在 Redis 上。你可以隨心所欲的實現(xiàn)它。這個接口中只有6-7 個方法。
  • 它能存多少數(shù)據(jù)?不是太多,因為生產(chǎn)環(huán)境幾乎會拋棄所有的東西,修剪下來,你一次只能保存 100 個。
  • 我們能從 Slack 收到通知嗎?我們正在努力。
  • 我能退出 Bugsnag/etc.嗎? 可能不能。雖然它簡易且輕便,但并不意味著穩(wěn)定健壯。小心火燭。
  • 我們能否按照時間戳進(jìn)行過濾?暫時還不能,但是這個是開源項目,幫幫我們

<figure style="margin: 1em 0px;">
image

</figure>

  • 在系統(tǒng)引導(dǎo)階段會產(chǎn)生什么影響?每次只會執(zhí)行一個查詢。生產(chǎn)環(huán)境中不會頻繁地把所有東西都插入進(jìn)去。你可以取消你不關(guān)心的監(jiān)聽器。
  • 我們能在同一個UI中檢查多個應(yīng)用嗎?可以;只需要在同一個數(shù)據(jù)庫中指向并記錄它們,然后考慮做標(biāo)記/過濾, 這樣你就可以按需做區(qū)分了。
  • Laravel 的哪個版本能與之兼容? 5.7.7+。
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容