2024-03-12 14:29:59 +00:00
|
|
|
package database
|
|
|
|
|
|
|
|
import (
|
2024-03-08 12:35:10 +00:00
|
|
|
"fmt"
|
2024-03-12 14:29:59 +00:00
|
|
|
"time"
|
|
|
|
|
|
|
|
"github.com/crowdsecurity/crowdsec/pkg/database/ent"
|
|
|
|
"github.com/crowdsecurity/crowdsec/pkg/database/ent/metric"
|
|
|
|
)
|
|
|
|
|
|
|
|
// TODO:
|
|
|
|
// what if they are alrady in the db (should get an error from the unique index)
|
|
|
|
// CollectMetricsToPush (count limit? including stale?)
|
|
|
|
// SetPushedMetrics
|
|
|
|
// RemoveOldMetrics
|
|
|
|
// avoid errors.Wrapf
|
|
|
|
|
|
|
|
func (c *Client) CreateMetric(generatedType metric.GeneratedType, generatedBy string, collectedAt time.Time, payload string) (*ent.Metric, error) {
|
|
|
|
metric, err := c.Ent.Metric.
|
|
|
|
Create().
|
|
|
|
SetGeneratedType(generatedType).
|
|
|
|
SetGeneratedBy(generatedBy).
|
|
|
|
SetCollectedAt(collectedAt).
|
|
|
|
SetPayload(payload).
|
|
|
|
Save(c.CTX)
|
|
|
|
|
2024-03-08 12:35:10 +00:00
|
|
|
switch {
|
|
|
|
case ent.IsConstraintError(err):
|
|
|
|
// pretty safe guess, it's the unique index
|
|
|
|
c.Log.Infof("storing metrics snapshot for '%s' at %s: already exists", generatedBy, collectedAt)
|
|
|
|
// it's polite to accept a duplicate snapshot without any error
|
|
|
|
return nil, nil
|
|
|
|
case err != nil:
|
2024-03-12 14:29:59 +00:00
|
|
|
c.Log.Warningf("CreateMetric: %s", err)
|
2024-03-08 12:35:10 +00:00
|
|
|
return nil, fmt.Errorf("storing metrics snapshot for '%s' at %s: %w", generatedBy, collectedAt, InsertFail)
|
2024-03-12 14:29:59 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
return metric, nil
|
|
|
|
}
|
2024-03-21 09:27:52 +00:00
|
|
|
|
|
|
|
func (c *Client) GetLPsUsageMetrics() ([]*ent.Metric, error) {
|
|
|
|
metrics, err := c.Ent.Metric.Query().
|
|
|
|
Where(
|
|
|
|
metric.GeneratedTypeEQ(metric.GeneratedTypeLP),
|
|
|
|
metric.PushedAtIsNil(),
|
|
|
|
).
|
|
|
|
Order(ent.Desc(metric.FieldCollectedAt)).
|
|
|
|
All(c.CTX)
|
|
|
|
if err != nil {
|
|
|
|
c.Log.Warningf("GetLPsUsageMetrics: %s", err)
|
|
|
|
return nil, fmt.Errorf("getting LPs usage metrics: %w", err)
|
|
|
|
}
|
|
|
|
|
|
|
|
return metrics, nil
|
|
|
|
}
|
|
|
|
|
|
|
|
func (c *Client) GetBouncersUsageMetrics() ([]*ent.Metric, error) {
|
|
|
|
metrics, err := c.Ent.Metric.Query().
|
|
|
|
Where(
|
|
|
|
metric.GeneratedTypeEQ(metric.GeneratedTypeRC),
|
|
|
|
metric.PushedAtIsNil(),
|
|
|
|
).
|
|
|
|
Order(ent.Desc(metric.FieldCollectedAt)).
|
|
|
|
All(c.CTX)
|
|
|
|
if err != nil {
|
|
|
|
c.Log.Warningf("GetBouncersUsageMetrics: %s", err)
|
|
|
|
return nil, fmt.Errorf("getting bouncers usage metrics: %w", err)
|
|
|
|
}
|
|
|
|
|
|
|
|
return metrics, nil
|
|
|
|
}
|
2024-04-19 16:33:46 +00:00
|
|
|
|
|
|
|
func (c *Client) MarkUsageMetricsAsSent(ids []int) error {
|
|
|
|
_, err := c.Ent.Metric.Update().
|
|
|
|
Where(metric.IDIn(ids...)).
|
|
|
|
SetPushedAt(time.Now()).
|
|
|
|
Save(c.CTX)
|
|
|
|
if err != nil {
|
|
|
|
c.Log.Warningf("MarkUsageMetricsAsSent: %s", err)
|
|
|
|
return fmt.Errorf("marking usage metrics as sent: %w", err)
|
|
|
|
}
|
|
|
|
|
|
|
|
return nil
|
|
|
|
}
|