mirror of
https://github.com/optim-enterprises-bv/vault.git
synced 2025-10-30 10:12:35 +00:00
Add vault.agent.authenticated metric (#26570)
* add vault.agent.authenticated metric fix metric name * Update command/agentproxyshared/auth/auth.go --------- Co-authored-by: Violet Hynes <violet.hynes@hashicorp.com>
This commit is contained in:
3
changelog/26570.txt
Normal file
3
changelog/26570.txt
Normal file
@@ -0,0 +1,3 @@
|
|||||||
|
```release-note:improvement
|
||||||
|
agent: Add metric (vault.agent.authenticated) that is set to 1 when vault agent has a valid token and zero if it does not.
|
||||||
|
```
|
||||||
@@ -145,12 +145,18 @@ func (ah *AuthHandler) Run(ctx context.Context, am AuthMethod) error {
|
|||||||
backoffCfg := newAutoAuthBackoff(ah.minBackoff, ah.maxBackoff, ah.exitOnError)
|
backoffCfg := newAutoAuthBackoff(ah.minBackoff, ah.maxBackoff, ah.exitOnError)
|
||||||
|
|
||||||
ah.logger.Info("starting auth handler")
|
ah.logger.Info("starting auth handler")
|
||||||
|
|
||||||
|
// Set unauthenticated when starting up
|
||||||
|
metrics.SetGauge([]string{ah.metricsSignifier, "authenticated"}, 0)
|
||||||
|
|
||||||
defer func() {
|
defer func() {
|
||||||
am.Shutdown()
|
am.Shutdown()
|
||||||
close(ah.OutputCh)
|
close(ah.OutputCh)
|
||||||
close(ah.TemplateTokenCh)
|
close(ah.TemplateTokenCh)
|
||||||
close(ah.ExecTokenCh)
|
close(ah.ExecTokenCh)
|
||||||
ah.logger.Info("auth handler stopped")
|
ah.logger.Info("auth handler stopped")
|
||||||
|
// Set unauthenticated when shutting down
|
||||||
|
metrics.SetGauge([]string{ah.metricsSignifier, "authenticated"}, 0)
|
||||||
}()
|
}()
|
||||||
|
|
||||||
credCh := am.NewCreds()
|
credCh := am.NewCreds()
|
||||||
@@ -217,6 +223,8 @@ func (ah *AuthHandler) Run(ctx context.Context, am AuthMethod) error {
|
|||||||
if err != nil {
|
if err != nil {
|
||||||
ah.logger.Error("error creating client for authentication call", "error", err, "backoff", backoffCfg)
|
ah.logger.Error("error creating client for authentication call", "error", err, "backoff", backoffCfg)
|
||||||
metrics.IncrCounter([]string{ah.metricsSignifier, "auth", "failure"}, 1)
|
metrics.IncrCounter([]string{ah.metricsSignifier, "auth", "failure"}, 1)
|
||||||
|
// Set unauthenticated when authentication fails
|
||||||
|
metrics.SetGauge([]string{ah.metricsSignifier, "authenticated"}, 0)
|
||||||
|
|
||||||
if backoffSleep(ctx, backoffCfg) {
|
if backoffSleep(ctx, backoffCfg) {
|
||||||
continue
|
continue
|
||||||
@@ -244,6 +252,8 @@ func (ah *AuthHandler) Run(ctx context.Context, am AuthMethod) error {
|
|||||||
if err != nil {
|
if err != nil {
|
||||||
ah.logger.Error("could not look up token", "err", err, "backoff", backoffCfg)
|
ah.logger.Error("could not look up token", "err", err, "backoff", backoffCfg)
|
||||||
metrics.IncrCounter([]string{ah.metricsSignifier, "auth", "failure"}, 1)
|
metrics.IncrCounter([]string{ah.metricsSignifier, "auth", "failure"}, 1)
|
||||||
|
// Set unauthenticated when authentication fails
|
||||||
|
metrics.SetGauge([]string{ah.metricsSignifier, "authenticated"}, 0)
|
||||||
|
|
||||||
if backoffSleep(ctx, backoffCfg) {
|
if backoffSleep(ctx, backoffCfg) {
|
||||||
continue
|
continue
|
||||||
@@ -264,6 +274,8 @@ func (ah *AuthHandler) Run(ctx context.Context, am AuthMethod) error {
|
|||||||
if err != nil {
|
if err != nil {
|
||||||
ah.logger.Error("error getting path or data from method", "error", err, "backoff", backoffCfg)
|
ah.logger.Error("error getting path or data from method", "error", err, "backoff", backoffCfg)
|
||||||
metrics.IncrCounter([]string{ah.metricsSignifier, "auth", "failure"}, 1)
|
metrics.IncrCounter([]string{ah.metricsSignifier, "auth", "failure"}, 1)
|
||||||
|
// Set unauthenticated when authentication fails
|
||||||
|
metrics.SetGauge([]string{ah.metricsSignifier, "authenticated"}, 0)
|
||||||
|
|
||||||
if backoffSleep(ctx, backoffCfg) {
|
if backoffSleep(ctx, backoffCfg) {
|
||||||
continue
|
continue
|
||||||
@@ -277,6 +289,7 @@ func (ah *AuthHandler) Run(ctx context.Context, am AuthMethod) error {
|
|||||||
if err != nil {
|
if err != nil {
|
||||||
ah.logger.Error("error creating client for wrapped call", "error", err, "backoff", backoffCfg)
|
ah.logger.Error("error creating client for wrapped call", "error", err, "backoff", backoffCfg)
|
||||||
metrics.IncrCounter([]string{ah.metricsSignifier, "auth", "failure"}, 1)
|
metrics.IncrCounter([]string{ah.metricsSignifier, "auth", "failure"}, 1)
|
||||||
|
metrics.SetGauge([]string{ah.metricsSignifier, "authenticated"}, 0)
|
||||||
|
|
||||||
if backoffSleep(ctx, backoffCfg) {
|
if backoffSleep(ctx, backoffCfg) {
|
||||||
continue
|
continue
|
||||||
@@ -315,6 +328,8 @@ func (ah *AuthHandler) Run(ctx context.Context, am AuthMethod) error {
|
|||||||
if err != nil {
|
if err != nil {
|
||||||
ah.logger.Error("error authenticating", "error", err, "backoff", backoffCfg)
|
ah.logger.Error("error authenticating", "error", err, "backoff", backoffCfg)
|
||||||
metrics.IncrCounter([]string{ah.metricsSignifier, "auth", "failure"}, 1)
|
metrics.IncrCounter([]string{ah.metricsSignifier, "auth", "failure"}, 1)
|
||||||
|
// Set unauthenticated when authentication fails
|
||||||
|
metrics.SetGauge([]string{ah.metricsSignifier, "authenticated"}, 0)
|
||||||
|
|
||||||
if backoffSleep(ctx, backoffCfg) {
|
if backoffSleep(ctx, backoffCfg) {
|
||||||
continue
|
continue
|
||||||
@@ -330,6 +345,8 @@ func (ah *AuthHandler) Run(ctx context.Context, am AuthMethod) error {
|
|||||||
if secret.WrapInfo == nil {
|
if secret.WrapInfo == nil {
|
||||||
ah.logger.Error("authentication returned nil wrap info", "backoff", backoffCfg)
|
ah.logger.Error("authentication returned nil wrap info", "backoff", backoffCfg)
|
||||||
metrics.IncrCounter([]string{ah.metricsSignifier, "auth", "failure"}, 1)
|
metrics.IncrCounter([]string{ah.metricsSignifier, "auth", "failure"}, 1)
|
||||||
|
// Set unauthenticated when authentication fails
|
||||||
|
metrics.SetGauge([]string{ah.metricsSignifier, "authenticated"}, 0)
|
||||||
|
|
||||||
if backoffSleep(ctx, backoffCfg) {
|
if backoffSleep(ctx, backoffCfg) {
|
||||||
continue
|
continue
|
||||||
@@ -339,6 +356,8 @@ func (ah *AuthHandler) Run(ctx context.Context, am AuthMethod) error {
|
|||||||
if secret.WrapInfo.Token == "" {
|
if secret.WrapInfo.Token == "" {
|
||||||
ah.logger.Error("authentication returned empty wrapped client token", "backoff", backoffCfg)
|
ah.logger.Error("authentication returned empty wrapped client token", "backoff", backoffCfg)
|
||||||
metrics.IncrCounter([]string{ah.metricsSignifier, "auth", "failure"}, 1)
|
metrics.IncrCounter([]string{ah.metricsSignifier, "auth", "failure"}, 1)
|
||||||
|
// Set unauthenticated when authentication fails
|
||||||
|
metrics.SetGauge([]string{ah.metricsSignifier, "authenticated"}, 0)
|
||||||
|
|
||||||
if backoffSleep(ctx, backoffCfg) {
|
if backoffSleep(ctx, backoffCfg) {
|
||||||
continue
|
continue
|
||||||
@@ -349,6 +368,8 @@ func (ah *AuthHandler) Run(ctx context.Context, am AuthMethod) error {
|
|||||||
if err != nil {
|
if err != nil {
|
||||||
ah.logger.Error("failed to encode wrapinfo", "error", err, "backoff", backoffCfg)
|
ah.logger.Error("failed to encode wrapinfo", "error", err, "backoff", backoffCfg)
|
||||||
metrics.IncrCounter([]string{ah.metricsSignifier, "auth", "failure"}, 1)
|
metrics.IncrCounter([]string{ah.metricsSignifier, "auth", "failure"}, 1)
|
||||||
|
// Set unauthenticated when authentication fails
|
||||||
|
metrics.SetGauge([]string{ah.metricsSignifier, "authenticated"}, 0)
|
||||||
|
|
||||||
if backoffSleep(ctx, backoffCfg) {
|
if backoffSleep(ctx, backoffCfg) {
|
||||||
continue
|
continue
|
||||||
@@ -388,6 +409,8 @@ func (ah *AuthHandler) Run(ctx context.Context, am AuthMethod) error {
|
|||||||
if secret == nil || secret.Data == nil {
|
if secret == nil || secret.Data == nil {
|
||||||
ah.logger.Error("token file validation failed, token may be invalid", "backoff", backoffCfg)
|
ah.logger.Error("token file validation failed, token may be invalid", "backoff", backoffCfg)
|
||||||
metrics.IncrCounter([]string{ah.metricsSignifier, "auth", "failure"}, 1)
|
metrics.IncrCounter([]string{ah.metricsSignifier, "auth", "failure"}, 1)
|
||||||
|
// Set unauthenticated when authentication fails
|
||||||
|
metrics.SetGauge([]string{ah.metricsSignifier, "authenticated"}, 0)
|
||||||
|
|
||||||
if backoffSleep(ctx, backoffCfg) {
|
if backoffSleep(ctx, backoffCfg) {
|
||||||
continue
|
continue
|
||||||
@@ -398,6 +421,8 @@ func (ah *AuthHandler) Run(ctx context.Context, am AuthMethod) error {
|
|||||||
if !ok || token == "" {
|
if !ok || token == "" {
|
||||||
ah.logger.Error("token file validation returned empty client token", "backoff", backoffCfg)
|
ah.logger.Error("token file validation returned empty client token", "backoff", backoffCfg)
|
||||||
metrics.IncrCounter([]string{ah.metricsSignifier, "auth", "failure"}, 1)
|
metrics.IncrCounter([]string{ah.metricsSignifier, "auth", "failure"}, 1)
|
||||||
|
// Set unauthenticated when authentication fails
|
||||||
|
metrics.SetGauge([]string{ah.metricsSignifier, "authenticated"}, 0)
|
||||||
|
|
||||||
if backoffSleep(ctx, backoffCfg) {
|
if backoffSleep(ctx, backoffCfg) {
|
||||||
continue
|
continue
|
||||||
@@ -414,6 +439,7 @@ func (ah *AuthHandler) Run(ctx context.Context, am AuthMethod) error {
|
|||||||
Renewable: renewable,
|
Renewable: renewable,
|
||||||
}
|
}
|
||||||
ah.logger.Info("authentication successful, sending token to sinks")
|
ah.logger.Info("authentication successful, sending token to sinks")
|
||||||
|
|
||||||
ah.OutputCh <- token
|
ah.OutputCh <- token
|
||||||
if ah.enableTemplateTokenCh {
|
if ah.enableTemplateTokenCh {
|
||||||
ah.TemplateTokenCh <- token
|
ah.TemplateTokenCh <- token
|
||||||
@@ -430,6 +456,8 @@ func (ah *AuthHandler) Run(ctx context.Context, am AuthMethod) error {
|
|||||||
if secret == nil || secret.Auth == nil {
|
if secret == nil || secret.Auth == nil {
|
||||||
ah.logger.Error("authentication returned nil auth info", "backoff", backoffCfg)
|
ah.logger.Error("authentication returned nil auth info", "backoff", backoffCfg)
|
||||||
metrics.IncrCounter([]string{ah.metricsSignifier, "auth", "failure"}, 1)
|
metrics.IncrCounter([]string{ah.metricsSignifier, "auth", "failure"}, 1)
|
||||||
|
// Set unauthenticated when authentication fails
|
||||||
|
metrics.SetGauge([]string{ah.metricsSignifier, "authenticated"}, 0)
|
||||||
|
|
||||||
if backoffSleep(ctx, backoffCfg) {
|
if backoffSleep(ctx, backoffCfg) {
|
||||||
continue
|
continue
|
||||||
@@ -439,6 +467,8 @@ func (ah *AuthHandler) Run(ctx context.Context, am AuthMethod) error {
|
|||||||
if secret.Auth.ClientToken == "" {
|
if secret.Auth.ClientToken == "" {
|
||||||
ah.logger.Error("authentication returned empty client token", "backoff", backoffCfg)
|
ah.logger.Error("authentication returned empty client token", "backoff", backoffCfg)
|
||||||
metrics.IncrCounter([]string{ah.metricsSignifier, "auth", "failure"}, 1)
|
metrics.IncrCounter([]string{ah.metricsSignifier, "auth", "failure"}, 1)
|
||||||
|
// Set unauthenticated when authentication fails
|
||||||
|
metrics.SetGauge([]string{ah.metricsSignifier, "authenticated"}, 0)
|
||||||
|
|
||||||
if backoffSleep(ctx, backoffCfg) {
|
if backoffSleep(ctx, backoffCfg) {
|
||||||
continue
|
continue
|
||||||
@@ -471,6 +501,8 @@ func (ah *AuthHandler) Run(ctx context.Context, am AuthMethod) error {
|
|||||||
if err != nil {
|
if err != nil {
|
||||||
ah.logger.Error("error creating lifetime watcher", "error", err, "backoff", backoffCfg)
|
ah.logger.Error("error creating lifetime watcher", "error", err, "backoff", backoffCfg)
|
||||||
metrics.IncrCounter([]string{ah.metricsSignifier, "auth", "failure"}, 1)
|
metrics.IncrCounter([]string{ah.metricsSignifier, "auth", "failure"}, 1)
|
||||||
|
// Set unauthenticated when authentication fails
|
||||||
|
metrics.SetGauge([]string{ah.metricsSignifier, "authenticated"}, 0)
|
||||||
|
|
||||||
if backoffSleep(ctx, backoffCfg) {
|
if backoffSleep(ctx, backoffCfg) {
|
||||||
continue
|
continue
|
||||||
@@ -479,6 +511,7 @@ func (ah *AuthHandler) Run(ctx context.Context, am AuthMethod) error {
|
|||||||
}
|
}
|
||||||
|
|
||||||
metrics.IncrCounter([]string{ah.metricsSignifier, "auth", "success"}, 1)
|
metrics.IncrCounter([]string{ah.metricsSignifier, "auth", "success"}, 1)
|
||||||
|
metrics.SetGauge([]string{ah.metricsSignifier, "authenticated"}, 1)
|
||||||
// We don't want to trigger the renewal process for the root token
|
// We don't want to trigger the renewal process for the root token
|
||||||
if isRootToken(leaseDuration, isTokenFileMethod, secret) {
|
if isRootToken(leaseDuration, isTokenFileMethod, secret) {
|
||||||
ah.logger.Info("not starting token renewal process, as token is root token")
|
ah.logger.Info("not starting token renewal process, as token is root token")
|
||||||
@@ -500,6 +533,8 @@ func (ah *AuthHandler) Run(ctx context.Context, am AuthMethod) error {
|
|||||||
if err != nil {
|
if err != nil {
|
||||||
ah.logger.Error("error renewing token", "error", err, "backoff", backoffCfg)
|
ah.logger.Error("error renewing token", "error", err, "backoff", backoffCfg)
|
||||||
metrics.IncrCounter([]string{ah.metricsSignifier, "auth", "failure"}, 1)
|
metrics.IncrCounter([]string{ah.metricsSignifier, "auth", "failure"}, 1)
|
||||||
|
// Set unauthenticated when authentication fails
|
||||||
|
metrics.SetGauge([]string{ah.metricsSignifier, "authenticated"}, 0)
|
||||||
|
|
||||||
// Add some exponential backoff so that if auth is successful
|
// Add some exponential backoff so that if auth is successful
|
||||||
// but the watcher errors, we won't go into an immediate
|
// but the watcher errors, we won't go into an immediate
|
||||||
@@ -525,6 +560,8 @@ func (ah *AuthHandler) Run(ctx context.Context, am AuthMethod) error {
|
|||||||
|
|
||||||
case <-watcher.RenewCh():
|
case <-watcher.RenewCh():
|
||||||
metrics.IncrCounter([]string{ah.metricsSignifier, "auth", "success"}, 1)
|
metrics.IncrCounter([]string{ah.metricsSignifier, "auth", "success"}, 1)
|
||||||
|
// Set authenticated when authentication succeeds
|
||||||
|
metrics.SetGauge([]string{ah.metricsSignifier, "authenticated"}, 1)
|
||||||
ah.logger.Info("renewed auth token")
|
ah.logger.Info("renewed auth token")
|
||||||
|
|
||||||
case <-credCh:
|
case <-credCh:
|
||||||
|
|||||||
@@ -288,6 +288,8 @@ runtime metrics about its performance, the auto-auth and the cache status:
|
|||||||
|
|
||||||
| Metric | Description | Type |
|
| Metric | Description | Type |
|
||||||
| -------------------------------- | ---------------------------------------------------- | ------- |
|
| -------------------------------- | ---------------------------------------------------- | ------- |
|
||||||
|
| `vault.agent.authenticated` | Current authentication status (1 - has valid token, | gauge |
|
||||||
|
| | 0 - no valid token) | |
|
||||||
| `vault.agent.auth.failure` | Number of authentication failures | counter |
|
| `vault.agent.auth.failure` | Number of authentication failures | counter |
|
||||||
| `vault.agent.auth.success` | Number of authentication successes | counter |
|
| `vault.agent.auth.success` | Number of authentication successes | counter |
|
||||||
| `vault.agent.proxy.success` | Number of requests successfully proxied | counter |
|
| `vault.agent.proxy.success` | Number of requests successfully proxied | counter |
|
||||||
|
|||||||
Reference in New Issue
Block a user