| 1 | // SPDX-License-Identifier: GPL-3.0-or-later |
| 2 | |
| 3 | package intelgpu |
| 4 | |
| 5 | import ( |
| 6 | "encoding/json" |
| 7 | "errors" |
| 8 | "fmt" |
| 9 | ) |
| 10 | |
| 11 | type ( |
| 12 | gpuSummaryStats struct { |
| 13 | Frequency struct { |
| 14 | Actual float64 `json:"actual"` |
| 15 | } `json:"frequency"` |
| 16 | Power struct { |
| 17 | GPU float64 `json:"gpu"` |
| 18 | Package float64 `json:"package"` |
| 19 | } `json:"power"` |
| 20 | Engines map[string]struct { |
| 21 | Busy float64 `json:"busy"` |
| 22 | } `json:"engines"` |
| 23 | } |
| 24 | ) |
| 25 | |
| 26 | const precision = 100 |
| 27 | |
| 28 | func (c *Collector) collect() (map[string]int64, error) { |
| 29 | if c.exec == nil { |
| 30 | return nil, errors.New("collector not initialized") |
| 31 | } |
| 32 | |
| 33 | stats, err := c.getGPUSummaryStats() |
| 34 | if err != nil { |
| 35 | return nil, err |
| 36 | } |
| 37 | |
| 38 | mx := make(map[string]int64) |
| 39 | |
| 40 | mx["frequency_actual"] = int64(stats.Frequency.Actual * precision) |
| 41 | mx["power_gpu"] = int64(stats.Power.GPU * precision) |
| 42 | mx["power_package"] = int64(stats.Power.Package * precision) |
| 43 | |
| 44 | for name, es := range stats.Engines { |
| 45 | if !c.engines[name] { |
| 46 | c.addEngineCharts(name) |
| 47 | c.engines[name] = true |
| 48 | } |
| 49 | |
| 50 | key := fmt.Sprintf("engine_%s_busy", name) |
| 51 | mx[key] = int64(es.Busy * precision) |
| 52 | } |
| 53 | |
| 54 | return mx, nil |
| 55 | } |
| 56 | func (c *Collector) getGPUSummaryStats() (*gpuSummaryStats, error) { |
| 57 | bs, err := c.exec.queryGPUSummaryJson() |
| 58 | if err != nil { |
| 59 | return nil, err |
| 60 | } |
| 61 | |
| 62 | if len(bs) == 0 { |
| 63 | return nil, errors.New("query returned empty response") |
| 64 | } |
| 65 | |
| 66 | var stats gpuSummaryStats |
| 67 | if err := json.Unmarshal(bs, &stats); err != nil { |
| 68 | return nil, err |
| 69 | } |
| 70 | |
| 71 | if len(stats.Engines) == 0 { |
| 72 | return nil, errors.New("query returned unexpected response") |
| 73 | } |
| 74 | |
| 75 | return &stats, nil |
| 76 | } |