mirror of
https://github.com/VictoriaMetrics/VictoriaMetrics.git
synced 2024-12-15 08:23:34 +01:00
vmalert: support specifying full http url in notifier static_configs target (#5261)
* vmalert: support specifying full http or https urls in notifier static_configs target address * show right label results in ui
This commit is contained in:
parent
c5e3b11762
commit
4fafdda13e
@ -1399,8 +1399,11 @@ For example:
|
|||||||
```yaml
|
```yaml
|
||||||
static_configs:
|
static_configs:
|
||||||
- targets:
|
- targets:
|
||||||
|
# support using full url
|
||||||
|
- 'http://alertmanager:9093/test/api/v2/alerts'
|
||||||
|
- 'https://alertmanager:9093/api/v2/alerts'
|
||||||
|
# the following target with only host:port will be used as <scheme>://localhost:9093/<path_prefix>/api/v2/alerts
|
||||||
- localhost:9093
|
- localhost:9093
|
||||||
- localhost:9095
|
|
||||||
|
|
||||||
consul_sd_configs:
|
consul_sd_configs:
|
||||||
- server: localhost:8500
|
- server: localhost:8500
|
||||||
|
@ -3,7 +3,6 @@ package notifier
|
|||||||
import (
|
import (
|
||||||
"crypto/md5"
|
"crypto/md5"
|
||||||
"fmt"
|
"fmt"
|
||||||
"gopkg.in/yaml.v2"
|
|
||||||
"net/url"
|
"net/url"
|
||||||
"os"
|
"os"
|
||||||
"path"
|
"path"
|
||||||
@ -11,6 +10,8 @@ import (
|
|||||||
"strings"
|
"strings"
|
||||||
"time"
|
"time"
|
||||||
|
|
||||||
|
"gopkg.in/yaml.v2"
|
||||||
|
|
||||||
"github.com/VictoriaMetrics/VictoriaMetrics/lib/promauth"
|
"github.com/VictoriaMetrics/VictoriaMetrics/lib/promauth"
|
||||||
"github.com/VictoriaMetrics/VictoriaMetrics/lib/promrelabel"
|
"github.com/VictoriaMetrics/VictoriaMetrics/lib/promrelabel"
|
||||||
"github.com/VictoriaMetrics/VictoriaMetrics/lib/promscrape/discovery/consul"
|
"github.com/VictoriaMetrics/VictoriaMetrics/lib/promscrape/discovery/consul"
|
||||||
@ -142,26 +143,23 @@ func parseLabels(target string, metaLabels *promutils.Labels, cfg *Config) (stri
|
|||||||
if labels.Len() == 0 {
|
if labels.Len() == 0 {
|
||||||
return "", nil, nil
|
return "", nil, nil
|
||||||
}
|
}
|
||||||
schemeRelabeled := labels.Get("__scheme__")
|
scheme := labels.Get("__scheme__")
|
||||||
if len(schemeRelabeled) == 0 {
|
if len(scheme) == 0 {
|
||||||
schemeRelabeled = "http"
|
scheme = "http"
|
||||||
}
|
}
|
||||||
addressRelabeled := labels.Get("__address__")
|
alertsPath := labels.Get("__alerts_path__")
|
||||||
if len(addressRelabeled) == 0 {
|
if !strings.HasPrefix(alertsPath, "/") {
|
||||||
|
alertsPath = "/" + alertsPath
|
||||||
|
}
|
||||||
|
address := labels.Get("__address__")
|
||||||
|
if len(address) == 0 {
|
||||||
return "", nil, nil
|
return "", nil, nil
|
||||||
}
|
}
|
||||||
if strings.Contains(addressRelabeled, "/") {
|
address = addMissingPort(scheme, address)
|
||||||
return "", nil, nil
|
u := fmt.Sprintf("%s://%s%s", scheme, address, alertsPath)
|
||||||
}
|
|
||||||
addressRelabeled = addMissingPort(schemeRelabeled, addressRelabeled)
|
|
||||||
alertsPathRelabeled := labels.Get("__alerts_path__")
|
|
||||||
if !strings.HasPrefix(alertsPathRelabeled, "/") {
|
|
||||||
alertsPathRelabeled = "/" + alertsPathRelabeled
|
|
||||||
}
|
|
||||||
u := fmt.Sprintf("%s://%s%s", schemeRelabeled, addressRelabeled, alertsPathRelabeled)
|
|
||||||
if _, err := url.Parse(u); err != nil {
|
if _, err := url.Parse(u); err != nil {
|
||||||
return "", nil, fmt.Errorf("invalid url %q for scheme=%q (%q), target=%q, metrics_path=%q (%q): %w",
|
return "", nil, fmt.Errorf("invalid url %q for scheme=%q (%q), target=%q, metrics_path=%q (%q): %w",
|
||||||
u, cfg.Scheme, schemeRelabeled, target, addressRelabeled, alertsPathRelabeled, err)
|
u, cfg.Scheme, scheme, target, address, alertsPath, err)
|
||||||
}
|
}
|
||||||
return u, labels, nil
|
return u, labels, nil
|
||||||
}
|
}
|
||||||
@ -181,9 +179,24 @@ func addMissingPort(scheme, target string) string {
|
|||||||
func mergeLabels(target string, metaLabels *promutils.Labels, cfg *Config) *promutils.Labels {
|
func mergeLabels(target string, metaLabels *promutils.Labels, cfg *Config) *promutils.Labels {
|
||||||
// See https://prometheus.io/docs/prometheus/latest/configuration/configuration/#relabel_config
|
// See https://prometheus.io/docs/prometheus/latest/configuration/configuration/#relabel_config
|
||||||
m := promutils.NewLabels(3 + metaLabels.Len())
|
m := promutils.NewLabels(3 + metaLabels.Len())
|
||||||
m.Add("__address__", target)
|
address := target
|
||||||
m.Add("__scheme__", cfg.Scheme)
|
scheme := cfg.Scheme
|
||||||
m.Add("__alerts_path__", path.Join("/", cfg.PathPrefix, alertManagerPath))
|
alertsPath := path.Join("/", cfg.PathPrefix, alertManagerPath)
|
||||||
|
// try to extract optional scheme and alertsPath from __address__.
|
||||||
|
if strings.HasPrefix(address, "http://") {
|
||||||
|
scheme = "http"
|
||||||
|
address = address[len("http://"):]
|
||||||
|
} else if strings.HasPrefix(address, "https://") {
|
||||||
|
scheme = "https"
|
||||||
|
address = address[len("https://"):]
|
||||||
|
}
|
||||||
|
if n := strings.IndexByte(address, '/'); n >= 0 {
|
||||||
|
alertsPath = address[n:]
|
||||||
|
address = address[:n]
|
||||||
|
}
|
||||||
|
m.Add("__address__", address)
|
||||||
|
m.Add("__scheme__", scheme)
|
||||||
|
m.Add("__alerts_path__", alertsPath)
|
||||||
m.AddFrom(metaLabels)
|
m.AddFrom(metaLabels)
|
||||||
return m
|
return m
|
||||||
}
|
}
|
||||||
|
@ -318,3 +318,47 @@ func TestMergeHTTPClientConfigs(t *testing.T) {
|
|||||||
t.Fatalf("expected BasicAuth tp be present")
|
t.Fatalf("expected BasicAuth tp be present")
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func TestParseLabels(t *testing.T) {
|
||||||
|
testCases := []struct {
|
||||||
|
name string
|
||||||
|
target string
|
||||||
|
cfg *Config
|
||||||
|
expectedAddress string
|
||||||
|
expectedErr bool
|
||||||
|
}{
|
||||||
|
{
|
||||||
|
"invalid address",
|
||||||
|
"invalid:*//url",
|
||||||
|
&Config{},
|
||||||
|
"",
|
||||||
|
true,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"use some default params",
|
||||||
|
"alertmanager:9093",
|
||||||
|
&Config{PathPrefix: "test"},
|
||||||
|
"http://alertmanager:9093/test/api/v2/alerts",
|
||||||
|
false,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"use target address",
|
||||||
|
"https://alertmanager:9093/api/v1/alerts",
|
||||||
|
&Config{Scheme: "http", PathPrefix: "test"},
|
||||||
|
"https://alertmanager:9093/api/v1/alerts",
|
||||||
|
false,
|
||||||
|
},
|
||||||
|
}
|
||||||
|
|
||||||
|
for _, tc := range testCases {
|
||||||
|
t.Run(tc.name, func(t *testing.T) {
|
||||||
|
address, _, err := parseLabels(tc.target, nil, tc.cfg)
|
||||||
|
if err == nil == tc.expectedErr {
|
||||||
|
t.Fatalf("unexpected error; got %t; want %t", err != nil, tc.expectedErr)
|
||||||
|
}
|
||||||
|
if address != tc.expectedAddress {
|
||||||
|
t.Fatalf("unexpected address; got %q; want %q", address, tc.expectedAddress)
|
||||||
|
}
|
||||||
|
})
|
||||||
|
}
|
||||||
|
}
|
||||||
|
@ -5,6 +5,7 @@ static_configs:
|
|||||||
- targets:
|
- targets:
|
||||||
- localhost:9093
|
- localhost:9093
|
||||||
- localhost:9095
|
- localhost:9095
|
||||||
|
- https://localhost:9093/test/api/v2/alerts
|
||||||
basic_auth:
|
basic_auth:
|
||||||
username: foo
|
username: foo
|
||||||
password: bar
|
password: bar
|
||||||
|
@ -49,6 +49,7 @@ The sandbox cluster installation is running under the constant load generated by
|
|||||||
This also means that `datasource.queryTimeAlignment` command-line flag becomes deprecated now and will have no effect if configured. If `datasource.queryTimeAlignment` was set to `false` before, then `eval_alignment` has to be set to `false` explicitly under group.
|
This also means that `datasource.queryTimeAlignment` command-line flag becomes deprecated now and will have no effect if configured. If `datasource.queryTimeAlignment` was set to `false` before, then `eval_alignment` has to be set to `false` explicitly under group.
|
||||||
See [this issue](https://github.com/VictoriaMetrics/VictoriaMetrics/issues/5049).
|
See [this issue](https://github.com/VictoriaMetrics/VictoriaMetrics/issues/5049).
|
||||||
* FEATURE: [vmalert](https://docs.victoriametrics.com/vmalert.html): add `-rule.evalDelay` flag and `eval_delay` attribute for [Groups](https://docs.victoriametrics.com/vmalert.html#groups). The new flag and param can be used to adjust the `time` parameter for rule evaluation requests to match [intentional query delay](https://docs.victoriametrics.com/keyConcepts.html#query-latency) from the datasource. See [this issue](https://github.com/VictoriaMetrics/VictoriaMetrics/issues/5155).
|
* FEATURE: [vmalert](https://docs.victoriametrics.com/vmalert.html): add `-rule.evalDelay` flag and `eval_delay` attribute for [Groups](https://docs.victoriametrics.com/vmalert.html#groups). The new flag and param can be used to adjust the `time` parameter for rule evaluation requests to match [intentional query delay](https://docs.victoriametrics.com/keyConcepts.html#query-latency) from the datasource. See [this issue](https://github.com/VictoriaMetrics/VictoriaMetrics/issues/5155).
|
||||||
|
* FEATURE: [vmalert](https://docs.victoriametrics.com/vmalert.html): allow specifying full url in notifier static_configs target address, like `http://alertmanager:9093/test/api/v2/alerts`. See [this issue](https://github.com/VictoriaMetrics/VictoriaMetrics/issues/5184).
|
||||||
* FEATURE: [vmagent](https://docs.victoriametrics.com/vmagent.html): support data ingestion from [NewRelic infrastructure agent](https://docs.newrelic.com/docs/infrastructure/install-infrastructure-agent). See [these docs](https://docs.victoriametrics.com/Single-server-VictoriaMetrics.html#how-to-send-data-from-newrelic-agent), [this feature request](https://github.com/VictoriaMetrics/VictoriaMetrics/issues/3520) and [this pull request](https://github.com/VictoriaMetrics/VictoriaMetrics/pull/4712).
|
* FEATURE: [vmagent](https://docs.victoriametrics.com/vmagent.html): support data ingestion from [NewRelic infrastructure agent](https://docs.newrelic.com/docs/infrastructure/install-infrastructure-agent). See [these docs](https://docs.victoriametrics.com/Single-server-VictoriaMetrics.html#how-to-send-data-from-newrelic-agent), [this feature request](https://github.com/VictoriaMetrics/VictoriaMetrics/issues/3520) and [this pull request](https://github.com/VictoriaMetrics/VictoriaMetrics/pull/4712).
|
||||||
* FEATURE: [vmagent](https://docs.victoriametrics.com/vmagent.html): do not exit on startup when [scrape_configs](https://docs.victoriametrics.com/sd_configs.html#scrape_configs) refer to non-existing or invalid files with auth configs, since these files may appear / updated later. See [this feature request](https://github.com/VictoriaMetrics/VictoriaMetrics/issues/4959) and [this pull request](https://github.com/VictoriaMetrics/VictoriaMetrics/pull/5153).
|
* FEATURE: [vmagent](https://docs.victoriametrics.com/vmagent.html): do not exit on startup when [scrape_configs](https://docs.victoriametrics.com/sd_configs.html#scrape_configs) refer to non-existing or invalid files with auth configs, since these files may appear / updated later. See [this feature request](https://github.com/VictoriaMetrics/VictoriaMetrics/issues/4959) and [this pull request](https://github.com/VictoriaMetrics/VictoriaMetrics/pull/5153).
|
||||||
* FEATURE: [vmagent](https://docs.victoriametrics.com/vmagent.html): allow loading TLS certificates from HTTP and HTTPS urls by specifying these urls at `cert_file` and `key_file` options inside `tls_config` and `proxy_tls_config` sections at [http client settings](https://docs.victoriametrics.com/sd_configs.html#http-api-client-options).
|
* FEATURE: [vmagent](https://docs.victoriametrics.com/vmagent.html): allow loading TLS certificates from HTTP and HTTPS urls by specifying these urls at `cert_file` and `key_file` options inside `tls_config` and `proxy_tls_config` sections at [http client settings](https://docs.victoriametrics.com/sd_configs.html#http-api-client-options).
|
||||||
|
@ -1410,8 +1410,11 @@ For example:
|
|||||||
```yaml
|
```yaml
|
||||||
static_configs:
|
static_configs:
|
||||||
- targets:
|
- targets:
|
||||||
|
# support using full url
|
||||||
|
- 'http://alertmanager:9093/test/api/v2/alerts'
|
||||||
|
- 'https://alertmanager:9093/api/v2/alerts'
|
||||||
|
# the following target with only host:port will be used as <scheme>://localhost:9093/<path_prefix>/api/v2/alerts
|
||||||
- localhost:9093
|
- localhost:9093
|
||||||
- localhost:9095
|
|
||||||
|
|
||||||
consul_sd_configs:
|
consul_sd_configs:
|
||||||
- server: localhost:8500
|
- server: localhost:8500
|
||||||
|
Loading…
Reference in New Issue
Block a user