一個獲得關於慢查詢、意外錯誤和其它重要日誌通知的簡單 Go 秘訣。
我的 Slack 機器人提示我一個運行了很長時間 SQL 查詢。我應該盡快解決它。
我們不能管理我們無法去測量的東西。每個後台應用程式都需要我們監視它在資料庫上的效能。如果一個特定的查詢隨著資料量增長變慢,你必須在它變得太慢之前去優化它。
由於 Slack 已經成為我們工作的中心,它也在改變我們監視系統的方式。雖然我們已經有非常好的監視工具,如果在系統中任何東西有正在惡化的趨勢,讓 Slack 機器人告訴我們,也是一個非常棒的主意。例如,一個太長時間才完成的 SQL 查詢,或者,在一個特定的 Go 套件中發生一個致命的錯誤。
在這篇部落格文章中,我們將告訴你,透過使用已經支援這些特性的一個簡單的日誌系統 和 一個已存在的資料庫庫(database library) 怎麼去設定來達到這個目的。
使用記錄器logger 是一個為 Go 函式庫和應用程式使用設計的小型函式庫。在這個例子中我們使用了它的三個重要的特性:
它為測量性能提供了一個簡單的定時器。
支援複雜的輸出過濾器,因此,你可以從指定的套件中選擇日誌。例如,你可以告訴記錄器僅從資料庫包中輸出,並且僅輸出超過 500 ms 的定時器日誌。
它有一個 Slack 鉤子,因此,你可以過濾並將日誌輸入到 Slack。
讓我們來看看在這個例子中,怎麼去使用定時器,稍後我們也會去使用過濾器:
package main import ( "github.com/azer/logger" "time" ) var ( users = logger.New("users") database = logger.New("database") ) func main () { users.Info("Hi!") timer := database.Timer() time.Sleep(time.Millisecond * 250) // sleep 250ms timer.End("Connected to database") users.Error("Failed to create a new user.", logger.Attrs{ "e-mail": "[email protected]", }) database.Info("Just a random log.") fmt.Println("Bye.") }
執行這個程式沒有輸出:
記錄器是缺省靜默的,因此,它可以在庫的內部使用。我們簡單地透過一個環境變數去查看日誌: 例如:
$ LOG=database@timer go run example-01.go 01:08:54.997 database(250.095587ms): Connected to database. Bye
上面的範例我們使用了 database@timer 過濾器去查看 database 套件中輸出的計時器日誌。你也可以試試其它的過濾器,例如:
LOG=*: 所有日誌
LOG=users@error,database: 所有來自 users 的錯誤日誌,所有來自 database 的所有日誌
LOG=*@timer,database@info: 來自所有套件的計時器日誌和錯誤日誌,以及來自 database 的所有日誌
LOG=*,users@mute: 除了 users 之外的所有日誌
控制台日誌是用來開發環境的,但是我們需要產品提供一個友善的介面。感謝 slack-hook, 我們可以輕鬆地在上面的範例中,使用 Slack 去整合它:
import ( "github.com/azer/logger" "github.com/azer/logger-slack-hook" ) func init () { logger.Hook(&slackhook.Writer{ WebHookURL: "https://hooks.slack.com/services/...", Channel: "slow-queries", Username: "Query Person", Filter: func (log *logger.Log) bool { return log.Package == "database" && log.Level == "TIMER" && log.Elapsed >= 200 } }) }
我們來解釋一下,在上面的範例中我們做了什麼:
行 #5: 設定入站 webhook url。這個 URL 連結在這裡。
行 #6: 選擇流日誌的入口通道。
行 #7: 顯示的發送者的使用者名稱。
行 #11: 使用流過濾器,僅輸出時間超過 200 ms 的定時器日誌。
希望這個範例能給你一個大概的思路。如果你有更多的問題,去看這個 記錄器的文件。
crud 是一個用於 Go 的資料庫的 ORM 式的類別庫,它有一個隱藏特性是內部日誌系統使用 logger 。這可以讓我們很容易地監視正在執行的 SQL 查詢。
查詢這有一個透過給定的 e-mail 去傳回使用者名稱的簡單查詢:
func GetUserNameByEmail (email string) (string, error) { var name string if err := DB.Read(&name, "SELECT name FROM user WHERE email=?", email); err != nil { return "", err } return name, nil }
好吧,這個太短了, 感覺好像缺少了什麼,讓我們增加全部的上下文:
import ( "github.com/azer/crud" _ "github.com/go-sql-driver/mysql" "os" ) var db *crud.DB func main () { var err error DB, err = crud.Connect("mysql", os.Getenv("DATABASE_URL")) if err != nil { panic(err) } username, err := GetUserNameByEmail("[email protected]") if err != nil { panic(err) } fmt.Println("Your username is: ", username) }
因此,我們有一個透過環境變數 DATABASE_URL 連接到 MySQL 資料庫的 crud 實例。如果我們運行這個程序,將看到有一行輸出:
$ DATABASE_URL=root:123456@/testdb go run example.go Your username is: azer
如我前面提到的,日誌是 預設靜默的。讓我們看一下 crud 的內部日誌:
$ LOG=crud go run example.go 22:56:29.691 crud(0): SQL Query Executed: SELECT username FROM user WHERE email='[email protected]' Your username is: azer
這很簡單,而且足夠我們去查看在我們的開發環境中查詢是怎麼執行的。
CRUD 和 Slack 整合記錄器是為配置管理應用程式層級的「內部日誌系統」而設計的。這意味著,你可以透過在你的應用程式層級配置記錄器,讓 crud 的日誌流入 Slack :
import ( "github.com/azer/logger" "github.com/azer/logger-slack-hook" ) func init () { logger.Hook(&slackhook.Writer{ WebHookURL: "https://hooks.slack.com/services/...", Channel: "slow-queries", Username: "Query Person", Filter: func (log *logger.Log) bool { return log.Package == "mysql" && log.Level == "TIMER" && log.Elapsed >= 250 } }) }
在上面的程式碼中:
我們匯入了 logger 和 logger-slack-hook 函式庫。
我們配置記錄器日誌流入 Slack。這個配置覆蓋了程式碼庫中 記錄器 所有的用法, 包括第三方依賴。
我們使用了流過濾器,僅輸出 MySQL 套件中超過 250 ms 的定時器日誌。
這種使用方法可以被擴展,而不僅僅是慢查詢報告。我個人使用它來追蹤指定包中的重要錯誤, 也用於統計一些類似新用戶登錄或產生付款的日誌。
crud
logger
logger-slack-hook
告訴我們 如果你有任何的問題或建議
以上是sql查詢的監視在Slack上發生的詳細內容。更多資訊請關注PHP中文網其他相關文章!

Linux管理員的平均年薪在美國為75,000至95,000美元,歐洲為40,000至60,000歐元。提升薪資可以通過:1.持續學習新技術,如雲計算和容器技術;2.積累項目經驗並建立Portfolio;3.建立職業網絡,拓展人脈。

Linux的主要用途包括:1.服務器操作系統,2.嵌入式系統,3.桌面操作系統,4.開發和測試環境。 Linux在這些領域表現出色,提供了穩定性、安全性和高效的開發工具。

互聯網運行不依賴單一操作系統,但Linux在其中扮演重要角色。 Linux廣泛應用於服務器和網絡設備,因其穩定性、安全性和可擴展性受歡迎。

Linux操作系統的核心是其命令行界面,通過命令行可以執行各種操作。 1.文件和目錄操作使用ls、cd、mkdir、rm等命令管理文件和目錄。 2.用戶和權限管理通過useradd、passwd、chmod等命令確保系統安全和資源分配。 3.進程管理使用ps、kill等命令監控和控制系統進程。 4.網絡操作包括ping、ifconfig、ssh等命令配置和管理網絡連接。 5.系統監控和維護通過top、df、du等命令了解系統運行狀態和資源使用情況。

介紹 Linux是一個強大的操作系統,由於其靈活性和效率,開發人員,系統管理員和電源用戶都喜歡。但是,經常使用長而復雜的命令可能是乏味的

Linux適用於服務器、開發環境和嵌入式系統。 1.作為服務器操作系統,Linux穩定高效,常用於部署高並發應用。 2.作為開發環境,Linux提供高效的命令行工具和包管理系統,提升開發效率。 3.在嵌入式系統中,Linux輕量且可定制,適合資源有限的環境。

簡介:通過基於Linux的道德黑客攻擊數字邊界 在我們越來越相互聯繫的世界中,網絡安全至關重要。 道德黑客入侵和滲透測試對於主動識別和減輕脆弱性至關重要

Linux基礎學習從零開始的方法包括:1.了解文件系統和命令行界面,2.掌握基本命令如ls、cd、mkdir,3.學習文件操作,如創建和編輯文件,4.探索高級用法如管道和grep命令,5.掌握調試技巧和性能優化,6.通過實踐和探索不斷提陞技能。


熱AI工具

Undresser.AI Undress
人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover
用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

AI Hentai Generator
免費產生 AI 無盡。

熱門文章

熱工具

SecLists
SecLists是最終安全測試人員的伙伴。它是一個包含各種類型清單的集合,這些清單在安全評估過程中經常使用,而且都在一個地方。 SecLists透過方便地提供安全測試人員可能需要的所有列表,幫助提高安全測試的效率和生產力。清單類型包括使用者名稱、密碼、URL、模糊測試有效載荷、敏感資料模式、Web shell等等。測試人員只需將此儲存庫拉到新的測試機上,他就可以存取所需的每種類型的清單。

Safe Exam Browser
Safe Exam Browser是一個安全的瀏覽器環境,安全地進行線上考試。該軟體將任何電腦變成一個安全的工作站。它控制對任何實用工具的訪問,並防止學生使用未經授權的資源。

Atom編輯器mac版下載
最受歡迎的的開源編輯器

MinGW - Minimalist GNU for Windows
這個專案正在遷移到osdn.net/projects/mingw的過程中,你可以繼續在那裡關注我們。 MinGW:GNU編譯器集合(GCC)的本機Windows移植版本,可自由分發的導入函式庫和用於建置本機Windows應用程式的頭檔;包括對MSVC執行時間的擴展,以支援C99功能。 MinGW的所有軟體都可以在64位元Windows平台上運作。

Dreamweaver CS6
視覺化網頁開發工具