返回

透过 Go 程序的“窗” 探秘程序的内在状态

后端

获取工具级应用或服务器内在状态的简单方法,允许从进程中暴露附加信息,可以借助标准工具(如 curl)或自定义工具获取这些信息。

在 Go 语言中,我们可以使用 expvar 和 expvarmon 包来洞察程序的内在状态,从而更好地进行调试和性能监控。

  1. expvar 简介

expvar 是 Go 语言标准库中提供的一个包,用于暴露程序的运行时信息,以便于调试和监控。expvar 中提供了各种各样的变量类型,包括整数、浮点数、字符串和布尔值等。我们可以在程序中使用这些变量来记录程序的运行时状态,比如当前处理的请求数量、内存使用情况、数据库连接数等。

  1. expvarmon 简介

expvarmon 是 expvar 的一个扩展包,它提供了更丰富的功能,包括对暴露的变量进行聚合和监控。expvarmon 可以自动发现和收集程序中暴露的变量,并将其聚合为一组指标(metrics)。这些指标可以通过各种方式进行展示,比如命令行、Web 界面或第三方监控系统。

  1. 使用 expvar 和 expvarmon

为了使用 expvar 和 expvarmon,我们需要在程序中导入这两个包。然后,我们可以使用 expvar 包中的各种变量类型来记录程序的运行时状态。比如,我们可以使用 expvar.NewInt("requests") 来记录当前处理的请求数量。

import (
    "expvar"
    "fmt"
)

var requests = expvar.NewInt("requests")

func main() {
    for i := 0; i < 100; i++ {
        requests.Add(1)
        fmt.Println("requests:", requests.Value())
    }
}

这段代码中,我们使用 expvar.NewInt("requests") 创建了一个新的整数变量,并将其命名为 requests。然后,我们在循环中将请求数量添加到该变量中。最后,我们在每次循环中都打印出 requests 的值。

  1. 通过命令行访问 expvar 信息

我们可以使用 curl 命令来访问 expvar 中暴露的变量。比如,我们可以使用以下命令来获取程序中暴露的所有变量:

curl http://localhost:8080/debug/vars
  1. 通过 Web 界面访问 expvar 信息

我们可以使用 expvarmon 包来创建一个简单的 Web 界面,用于展示程序中暴露的变量。比如,我们可以使用以下代码来创建一个简单的 Web 界面:

import (
    "expvar"
    "expvarmon"
    "log"
    "net/http"
)

func main() {
    // 创建一个新的 expvarmon 服务。
    mux := http.NewServeMux()
    expvarmon.Handler(mux)

    // 启动 HTTP 服务。
    log.Fatal(http.ListenAndServe(":8080", mux))
}

这段代码中,我们使用 expvarmon.Handler(mux) 来将 expvarmon 的处理程序添加到 HTTP 服务的路由器中。然后,我们在 ":8080" 端口上启动 HTTP 服务。

  1. 通过第三方监控系统访问 expvar 信息

我们可以使用各种第三方监控系统来收集和展示 expvar 中暴露的变量。比如,我们可以使用 Prometheus、Grafana 或 Datadog 等监控系统。

  1. 彩蛋

在 Go 语言中,我们还可以使用 runtime.MemStats() 函数来获取程序的内存使用情况。比如,我们可以使用以下代码来获取程序的内存使用情况:

import (
    "fmt"
    "runtime"
)

func main() {
    var m runtime.MemStats
    runtime.ReadMemStats(&m)
    fmt.Println("Alloc:", m.Alloc)
    fmt.Println("TotalAlloc:", m.TotalAlloc)
    fmt.Println("Sys:", m.Sys)
    fmt.Println("NumGC:", m.NumGC)
}

这段代码中,我们使用 runtime.ReadMemStats(&m) 来获取程序的内存使用情况。然后,我们使用 fmt.Println() 函数来打印出内存使用情况的各种信息。

  1. 结语

通过使用 expvar 和 expvarmon,我们可以轻松地获取工具级应用或服务器的内在状态,从而更好地进行调试和性能监控。这些信息可以帮助我们快速发现程序中的问题,并及时采取措施进行修复。