prometheus-community / ipmi_exporter

Remote IPMI exporter for Prometheus
MIT License
459 stars 131 forks source link

was collected before with the same name and label values #196

Closed lklkxcxc closed 3 months ago

lklkxcxc commented 3 months ago

ipmi_exporter version :1.8.0

The report as follow error when I was collected h3c server with lan H3C HDM version: 1.69 BIOS version: 6.10.36 logs:

32 error(s) occurred:
* collected metric "ipmi_fan_speed_rpm" { label:{name:"id"  value:"93"}  label:{name:"name"  value:"FAN1_F_Speed"}  gauge:{value:6900}} was collected before with the same name and label values
* collected metric "ipmi_fan_speed_state" { label:{name:"id"  value:"93"}  label:{name:"name"  value:"FAN1_F_Speed"}  gauge:{value:0}} was collected before with the same name and label values
* collected metric "ipmi_fan_speed_rpm" { label:{name:"id"  value:"94"}  label:{name:"name"  value:"FAN2_F_Speed"}  gauge:{value:6900}} was collected before with the same name and label values
* collected metric "ipmi_fan_speed_state" { label:{name:"id"  value:"94"}  label:{name:"name"  value:"FAN2_F_Speed"}  gauge:{value:0}} was collected before with the same name and label values
* collected metric "ipmi_fan_speed_rpm" { label:{name:"id"  value:"95"}  label:{name:"name"  value:"FAN3_F_Speed"}  gauge:{value:6900}} was collected before with the same name and label values
* collected metric "ipmi_fan_speed_state" { label:{name:"id"  value:"95"}  label:{name:"name"  value:"FAN3_F_Speed"}  gauge:{value:0}} was collected before with the same name and label values
lklkxcxc commented 3 months ago

I add flollw code in freeipmi.go :

func removeDuplicates(output []byte) []byte {
        lines := strings.Split(string(output), "\n")
        seen := make(map[string]bool)
        result := []byte{}

        for _, line := range lines {
                if line == "" {
                        continue
                }
                if !seen[line] {
                        seen[line] = true
                        result = append(result, []byte(line+"\n")...)
                }
        }

        return result
}

The Execute func add:

func Execute(cmd string, args []string, config string, target string, logger log.Logger) Result {
        pipe, err := freeipmiConfigPipe(config, logger)
        if err != nil {
                return Result{nil, err}
        }
        defer func() {
                if err := os.Remove(pipe); err != nil {
                        level.Error(logger).Log("msg", "Error deleting named pipe", "error", err)
                }
        }()

        args = append(args, "--config-file", pipe)
        if target != "" {
                args = append(args, "-h", target)
        }

        level.Debug(logger).Log("msg", "Executing", "command", cmd, "args", fmt.Sprintf("%+v", args))
        out, err := exec.Command(cmd, args...).CombinedOutput()
        if err != nil {
                err = fmt.Errorf("error running %s: %s", cmd, err)
        }

        out = removeDuplicates(out) //add removeDuplicates func
        return Result{out, err}
}