Add basic authentication support

This commit is contained in:
Holger Obermaier 2023-09-20 17:41:12 +02:00
parent 94d5822426
commit a401e4cdd1
2 changed files with 26 additions and 0 deletions

View File

@ -24,6 +24,11 @@ type HttpSinkConfig struct {
// JSON web tokens for authentication (Using the *Bearer* scheme) // JSON web tokens for authentication (Using the *Bearer* scheme)
JWT string `json:"jwt,omitempty"` JWT string `json:"jwt,omitempty"`
// Basic authentication
Username string `json:"username"`
Password string `json:"password"`
useBasicAuth bool
// time limit for requests made by the http client // time limit for requests made by the http client
Timeout string `json:"timeout,omitempty"` Timeout string `json:"timeout,omitempty"`
timeout time.Duration timeout time.Duration
@ -198,6 +203,11 @@ func (s *HttpSink) Flush() error {
req.Header.Set("Authorization", fmt.Sprintf("Bearer %s", s.config.JWT)) req.Header.Set("Authorization", fmt.Sprintf("Bearer %s", s.config.JWT))
} }
// Set basic authentication
if s.config.useBasicAuth {
req.SetBasicAuth(s.config.Username, s.config.Password)
}
// Do request // Do request
res, err = s.client.Do(req) res, err = s.client.Do(req)
if err != nil { if err != nil {
@ -254,6 +264,18 @@ func NewHttpSink(name string, config json.RawMessage) (Sink, error) {
if len(s.config.URL) == 0 { if len(s.config.URL) == 0 {
return nil, errors.New("`url` config option is required for HTTP sink") return nil, errors.New("`url` config option is required for HTTP sink")
} }
// Check basic authentication config
if len(s.config.Username) > 0 || len(s.config.Password) > 0 {
s.config.useBasicAuth = true
}
if s.config.useBasicAuth && len(s.config.Username) == 0 {
return nil, errors.New("basic authentication requires username")
}
if s.config.useBasicAuth && len(s.config.Password) == 0 {
return nil, errors.New("basic authentication requires password")
}
if len(s.config.IdleConnTimeout) > 0 { if len(s.config.IdleConnTimeout) > 0 {
t, err := time.ParseDuration(s.config.IdleConnTimeout) t, err := time.ParseDuration(s.config.IdleConnTimeout)
if err == nil { if err == nil {

View File

@ -13,6 +13,8 @@ The `http` sink uses POST requests to a HTTP server to submit the metrics in the
], ],
"url" : "https://my-monitoring.example.com:1234/api/write", "url" : "https://my-monitoring.example.com:1234/api/write",
"jwt" : "blabla.blabla.blabla", "jwt" : "blabla.blabla.blabla",
"username": "myUser",
"password": "myPW",
"timeout": "5s", "timeout": "5s",
"idle_connection_timeout" : "5s", "idle_connection_timeout" : "5s",
"flush_delay": "2s", "flush_delay": "2s",
@ -24,6 +26,8 @@ The `http` sink uses POST requests to a HTTP server to submit the metrics in the
- `meta_as_tags`: Move specific meta information to the tags in the output (optional) - `meta_as_tags`: Move specific meta information to the tags in the output (optional)
- `url`: The full URL of the endpoint - `url`: The full URL of the endpoint
- `jwt`: JSON web tokens for authentication (Using the *Bearer* scheme) - `jwt`: JSON web tokens for authentication (Using the *Bearer* scheme)
- `username`: username for basic authentication
- `password`: password for basic authentication
- `timeout`: General timeout for the HTTP client (default '5s') - `timeout`: General timeout for the HTTP client (default '5s')
- `max_retries`: Maximum number of retries to connect to the http server - `max_retries`: Maximum number of retries to connect to the http server
- `idle_connection_timeout`: Timeout for idle connections (default '120s'). Should be larger than the measurement interval to keep the connection open - `idle_connection_timeout`: Timeout for idle connections (default '120s'). Should be larger than the measurement interval to keep the connection open