Path: blob/main/pkg/integrations/snmp_exporter/snmp.go
5391 views
package snmp_exporter12import (3"fmt"4"net/http"5"time"67"github.com/go-kit/log"8"github.com/go-kit/log/level"9"github.com/prometheus/client_golang/prometheus"10"github.com/prometheus/client_golang/prometheus/promhttp"11"github.com/prometheus/snmp_exporter/collector"12snmp_config "github.com/prometheus/snmp_exporter/config"13)1415type snmpHandler struct {16cfg *Config17modules *snmp_config.Config18log log.Logger19}2021func (sh *snmpHandler) handler(w http.ResponseWriter, r *http.Request) {22logger := sh.log2324query := r.URL.Query()2526snmpTargets := make(map[string]SNMPTarget)27for _, target := range sh.cfg.SnmpTargets {28snmpTargets[target.Name] = target29}3031var target string32targetName := query.Get("target")33if len(query["target"]) != 1 || targetName == "" {34http.Error(w, "'target' parameter must be specified once", 400)35return36}3738t, ok := snmpTargets[targetName]39if ok {40target = t.Target41} else {42target = targetName43}4445moduleName := query.Get("module")46if len(query["module"]) > 1 {47http.Error(w, "'module' parameter must only be specified once", 400)48return49}50if moduleName == "" {51moduleName = "if_mib"52}5354module, ok := (*sh.modules)[moduleName]55if !ok {56http.Error(w, fmt.Sprintf("Unknown module '%s'", moduleName), 400)57return58}5960// override module connection details with custom walk params if provided61walkParams := query.Get("walk_params")62if len(query["walk_params"]) > 1 {63http.Error(w, "'walk_params' parameter must only be specified once", 400)64return65}6667if walkParams != "" {68if wp, ok := sh.cfg.WalkParams[walkParams]; ok {69// module.WalkParams = wp70if wp.Version != 0 {71module.WalkParams.Version = wp.Version72}73if wp.MaxRepetitions != 0 {74module.WalkParams.MaxRepetitions = wp.MaxRepetitions75}76if wp.Retries != 0 {77module.WalkParams.Retries = wp.Retries78}79if wp.Timeout != 0 {80module.WalkParams.Timeout = wp.Timeout81}82module.WalkParams.Auth = wp.Auth83} else {84http.Error(w, fmt.Sprintf("Unknown walk_params '%s'", walkParams), 400)85return86}87logger = log.With(logger, "module", moduleName, "target", target, "walk_params", walkParams)88} else {89logger = log.With(logger, "module", moduleName, "target", target)90}91level.Debug(logger).Log("msg", "Starting scrape")9293start := time.Now()94registry := prometheus.NewRegistry()95c := collector.New(r.Context(), target, module, logger)96registry.MustRegister(c)97// Delegate http serving to Prometheus client library, which will call collector.Collect.98h := promhttp.HandlerFor(registry, promhttp.HandlerOpts{})99h.ServeHTTP(w, r)100duration := time.Since(start).Seconds()101level.Debug(logger).Log("msg", "Finished scrape", "duration_seconds", duration)102}103104func (sh snmpHandler) ServeHTTP(w http.ResponseWriter, r *http.Request) {105sh.handler(w, r)106}107108109