master
go 81 lines 1.92 KB
Raw
1 // SPDX-License-Identifier: GPL-3.0-or-later
2
3 package azure_monitor
4
5 import (
6 "context"
7 "errors"
8 "fmt"
9 "time"
10 )
11
12 func (c *Collector) collect(ctx context.Context) error {
13 hasResources, err := c.refreshCollectResources(ctx)
14 if err != nil {
15 return err
16 }
17 if !hasResources {
18 return nil
19 }
20
21 now := c.now()
22 queryBatches := c.buildQueryBatches(now)
23
24 dueInstruments := dueInstrumentsForBatches(queryBatches)
25 samples, err := c.collectQuerySamples(ctx, queryBatches, now)
26 if err != nil {
27 return err
28 }
29
30 observedThisCycle := c.observations.observeSamples(samples)
31 c.observations.reobserveCachedObservations(dueInstruments, observedThisCycle)
32
33 return nil
34 }
35
36 func (c *Collector) refreshCollectResources(ctx context.Context) (bool, error) {
37 if err := c.ensureBootstrapped(ctx); err != nil {
38 return false, err
39 }
40
41 prevFetchCounter := c.discovery.FetchCounter
42 resources, err := c.refreshDiscovery(ctx, false)
43 if err != nil {
44 if c.discovery.FetchedAt.IsZero() {
45 return false, fmt.Errorf("resource discovery: %w", err)
46 }
47 c.Warningf("resource discovery refresh failed, continuing with last known discovery snapshot: %v", err)
48 resources = c.discovery.Resources
49 }
50 if c.discovery.FetchCounter != prevFetchCounter {
51 c.observations.pruneStaleResources(c.discovery.ByProfile)
52 }
53 return len(resources) > 0, nil
54 }
55
56 func (c *Collector) collectQuerySamples(ctx context.Context, batches []queryBatch, queryNow time.Time) ([]metricSample, error) {
57 if len(batches) == 0 {
58 return nil, nil
59 }
60
61 results := c.queryExecutor.runQueryBatches(ctx, batches, queryNow, c.QueryOffset)
62
63 var (
64 allSamples []metricSample
65 errCount int
66 )
67 for _, res := range results {
68 if res.Err != nil {
69 errCount++
70 c.Warningf("collection batch failed: %v", res.Err)
71 continue
72 }
73 allSamples = append(allSamples, res.Samples...)
74 }
75
76 if errCount == len(results) {
77 return nil, errors.New("all Azure Monitor batch queries failed")
78 }
79
80 return allSamples, nil
81 }