// quarantineSeriesFile moves a series file to the orphaned directory. It also // writes a hint file with the provided quarantine reason and, if series is // non-nil, the string representation of the metric. func (p *persistence) quarantineSeriesFile(fp model.Fingerprint, quarantineReason error, metric model.Metric) error { var ( oldName = p.fileNameForFingerprint(fp) orphanedDir = filepath.Join(p.basePath, "orphaned", filepath.Base(filepath.Dir(oldName))) newName = filepath.Join(orphanedDir, filepath.Base(oldName)) hintName = newName[:len(newName)-len(seriesFileSuffix)] + hintFileSuffix ) renameErr := os.MkdirAll(orphanedDir, 0700) if renameErr != nil { return renameErr } renameErr = os.Rename(oldName, newName) if os.IsNotExist(renameErr) { // Source file dosn't exist. That's normal. renameErr = nil } // Write hint file even if the rename ended in an error. At least try... // And ignore errors writing the hint file. It's best effort. if f, err := os.Create(hintName); err == nil { if metric != nil { f.WriteString(metric.String() + "\n") } else { f.WriteString("[UNKNOWN METRIC]\n") } if quarantineReason != nil { f.WriteString(quarantineReason.Error() + "\n") } else { f.WriteString("[UNKNOWN REASON]\n") } f.Close() } return renameErr }
func formatLegend(metric pmodel.Metric, query *PrometheusQuery) string { if query.LegendFormat == "" { return metric.String() } result := legendFormat.ReplaceAllFunc([]byte(query.LegendFormat), func(in []byte) []byte { labelName := strings.Replace(string(in), "{{", "", 1) labelName = strings.Replace(labelName, "}}", "", 1) labelName = strings.TrimSpace(labelName) if val, exists := metric[pmodel.LabelName(labelName)]; exists { return []byte(val) } return in }) return string(result) }
// HTMLSnippet returns an HTML snippet representing this alerting rule. The // resulting snippet is expected to be presented in a <pre> element, so that // line breaks and other returned whitespace is respected. func (rule *AlertingRule) HTMLSnippet(pathPrefix string) template.HTML { alertMetric := model.Metric{ model.MetricNameLabel: alertMetricName, alertNameLabel: model.LabelValue(rule.name), } s := fmt.Sprintf("ALERT <a href=%q>%s</a>", pathPrefix+strutil.GraphLinkForExpression(alertMetric.String()), rule.name) s += fmt.Sprintf("\n IF <a href=%q>%s</a>", pathPrefix+strutil.GraphLinkForExpression(rule.vector.String()), rule.vector) if rule.holdDuration > 0 { s += fmt.Sprintf("\n FOR %s", strutil.DurationToString(rule.holdDuration)) } if len(rule.labels) > 0 { s += fmt.Sprintf("\n WITH %s", rule.labels) } if len(rule.annotations) > 0 { s += fmt.Sprintf("\n ANNOTATIONS %s", rule.annotations) } return template.HTML(s) }
// HTMLSnippet returns an HTML snippet representing this alerting rule. The // resulting snippet is expected to be presented in a <pre> element, so that // line breaks and other returned whitespace is respected. func (r *AlertingRule) HTMLSnippet(pathPrefix string) html_template.HTML { alertMetric := model.Metric{ model.MetricNameLabel: alertMetricName, alertNameLabel: model.LabelValue(r.name), } s := fmt.Sprintf("ALERT <a href=%q>%s</a>", pathPrefix+strutil.GraphLinkForExpression(alertMetric.String()), r.name) s += fmt.Sprintf("\n IF <a href=%q>%s</a>", pathPrefix+strutil.GraphLinkForExpression(r.vector.String()), html_template.HTMLEscapeString(r.vector.String())) if r.holdDuration > 0 { s += fmt.Sprintf("\n FOR %s", model.Duration(r.holdDuration)) } if len(r.labels) > 0 { s += fmt.Sprintf("\n LABELS %s", html_template.HTMLEscapeString(r.labels.String())) } if len(r.annotations) > 0 { s += fmt.Sprintf("\n ANNOTATIONS %s", html_template.HTMLEscapeString(r.annotations.String())) } return html_template.HTML(s) }
// HTMLSnippet returns an HTML snippet representing this alerting rule. The // resulting snippet is expected to be presented in a <pre> element, so that // line breaks and other returned whitespace is respected. func (rule *AlertingRule) HTMLSnippet(pathPrefix string) template.HTML { alertMetric := model.Metric{ model.MetricNameLabel: alertMetricName, alertNameLabel: model.LabelValue(rule.name), } s := fmt.Sprintf("ALERT <a href=%q>%s</a>", pathPrefix+strutil.GraphLinkForExpression(alertMetric.String()), rule.name) s += fmt.Sprintf("\n IF <a href=%q>%s</a>", pathPrefix+strutil.GraphLinkForExpression(rule.vector.String()), rule.vector) if rule.holdDuration > 0 { s += fmt.Sprintf("\n FOR %s", strutil.DurationToString(rule.holdDuration)) } if len(rule.labels) > 0 { s += fmt.Sprintf("\n WITH %s", rule.labels) } s += fmt.Sprintf("\n SUMMARY %q", rule.summary) s += fmt.Sprintf("\n DESCRIPTION %q", rule.description) s += fmt.Sprintf("\n RUNBOOK %q", rule.runbook) return template.HTML(s) }