http.HandleFunc(path.Join(*routePrefix, "/probe"), func(w http.ResponseWriter, r *http.Request) {
sc.Lock()
conf := sc.C
sc.Unlock()
prober.Handler(w, r, conf, logger, rh, *timeoutOffset, nil, moduleUnknownCounter, allowedLevel)
})

我们了解到blackbox_exporter中都是通过请求/probe来进行端口探测的,那么今天我们来详尽的分析prober.Handler相关源码。
目录
函数签名
func Handler(w http.ResponseWriter, r *http.Request, c *config.Config, logger *slog.Logger, rh *ResultHistory, timeoutOffset float64, params url.Values, moduleUnknownCounter prometheus.Counter, logLevelProber *promslog.AllowedLevel)
w http.ResponseWriter:HTTP 响应对象,用于向客户端发送响应。r *http.Request:HTTP 请求对象,包含请求信息。c *config.Config:包含配置的对象,包含了可用的探针模块等配置。logger *slog.Logger:日志记录器,用于输出日志。rh *ResultHistory:用于记录结果历史的对象。timeoutOffset float64:超时偏移量,可能用于调整默认的超时设置。params url.Values:URL 查询参数,通常包含了目标和其他探测信息。moduleUnknownCounter prometheus.Counter:Prometheus 计数器,用于统计未知模块的次数。logLevelProber *promslog.AllowedLevel:日志级别,控制探测日志的详细程度。
1. 获取 URL 查询参数 params
if params == nil {
params = r.URL.Query()
}
- 如果
params参数为空(即传入的 URL 查询参数为空),则使用 HTTP 请求的查询参数r.URL.Query()。
2. 获取探针模块名称
moduleName := params.Get("module")
if moduleName == "" {
moduleName = "http_2xx"
}
module, ok := c.Modules[moduleName]
if !ok {
http.Error(w, fmt.Sprintf("Unknown module %q", moduleName), http.StatusBadRequest)
logger.Debug("Unknown module", "module", moduleName)
if moduleUnknownCounter != nil {
moduleUnknownCounter.Add(1)
}
return
}
- 获取 URL 查询参数中的
module参数。如果没有传递module参数,默认设置为http_2xx。 - 通过
moduleName从配置c.Modules中获取对应的模块配置。如果模块不存在,返回 HTTP 错误400 BadRequest。
3. 解析超时设置
timeoutSeconds, err := getTimeout

最低0.47元/天 解锁文章
1254

被折叠的 条评论
为什么被折叠?



