forked from prometheus/mysqld_exporter
/
perf_schema_file_events.go
133 lines (120 loc) · 4.36 KB
/
perf_schema_file_events.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
// Copyright 2018 The Prometheus Authors
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
// Scrape `performance_schema.file_summary_by_event_name`.
package collector
import (
"context"
"database/sql"
"github.com/go-kit/log"
"github.com/prometheus/client_golang/prometheus"
)
const perfFileEventsQuery = `
SELECT
EVENT_NAME,
COUNT_READ, SUM_TIMER_READ, SUM_NUMBER_OF_BYTES_READ,
COUNT_WRITE, SUM_TIMER_WRITE, SUM_NUMBER_OF_BYTES_WRITE,
COUNT_MISC, SUM_TIMER_MISC
FROM performance_schema.file_summary_by_event_name
`
// Metric descriptors.
var (
performanceSchemaFileEventsDesc = prometheus.NewDesc(
prometheus.BuildFQName(namespace, performanceSchema, "file_events_total"),
"The total file events by event name/mode.",
[]string{"event_name", "mode"}, nil,
)
performanceSchemaFileEventsTimeDesc = prometheus.NewDesc(
prometheus.BuildFQName(namespace, performanceSchema, "file_events_seconds_total"),
"The total seconds of file events by event name/mode.",
[]string{"event_name", "mode"}, nil,
)
performanceSchemaFileEventsBytesDesc = prometheus.NewDesc(
prometheus.BuildFQName(namespace, performanceSchema, "file_events_bytes_total"),
"The total bytes of file events by event name/mode.",
[]string{"event_name", "mode"}, nil,
)
)
// ScrapePerfFileEvents collects from `performance_schema.file_summary_by_event_name`.
type ScrapePerfFileEvents struct{}
// Name of the Scraper. Should be unique.
func (ScrapePerfFileEvents) Name() string {
return "perf_schema.file_events"
}
// Help describes the role of the Scraper.
func (ScrapePerfFileEvents) Help() string {
return "Collect metrics from performance_schema.file_summary_by_event_name"
}
// Version of MySQL from which scraper is available.
func (ScrapePerfFileEvents) Version() float64 {
return 5.6
}
// Scrape collects data from database connection and sends it over channel as prometheus metric.
func (ScrapePerfFileEvents) Scrape(ctx context.Context, db *sql.DB, ch chan<- prometheus.Metric, logger log.Logger) error {
// Timers here are returned in picoseconds.
perfSchemaFileEventsRows, err := db.QueryContext(ctx, perfFileEventsQuery)
if err != nil {
return err
}
defer perfSchemaFileEventsRows.Close()
var (
eventName string
countRead, timeRead, bytesRead uint64
countWrite, timeWrite, bytesWrite uint64
countMisc, timeMisc uint64
)
for perfSchemaFileEventsRows.Next() {
if err := perfSchemaFileEventsRows.Scan(
&eventName,
&countRead, &timeRead, &bytesRead,
&countWrite, &timeWrite, &bytesWrite,
&countMisc, &timeMisc,
); err != nil {
return err
}
ch <- prometheus.MustNewConstMetric(
performanceSchemaFileEventsDesc, prometheus.CounterValue, float64(countRead),
eventName, "read",
)
ch <- prometheus.MustNewConstMetric(
performanceSchemaFileEventsTimeDesc, prometheus.CounterValue, float64(timeRead)/picoSeconds,
eventName, "read",
)
ch <- prometheus.MustNewConstMetric(
performanceSchemaFileEventsBytesDesc, prometheus.CounterValue, float64(bytesRead),
eventName, "read",
)
ch <- prometheus.MustNewConstMetric(
performanceSchemaFileEventsDesc, prometheus.CounterValue, float64(countWrite),
eventName, "write",
)
ch <- prometheus.MustNewConstMetric(
performanceSchemaFileEventsTimeDesc, prometheus.CounterValue, float64(timeWrite)/picoSeconds,
eventName, "write",
)
ch <- prometheus.MustNewConstMetric(
performanceSchemaFileEventsBytesDesc, prometheus.CounterValue, float64(bytesWrite),
eventName, "write",
)
ch <- prometheus.MustNewConstMetric(
performanceSchemaFileEventsDesc, prometheus.CounterValue, float64(countMisc),
eventName, "misc",
)
ch <- prometheus.MustNewConstMetric(
performanceSchemaFileEventsTimeDesc, prometheus.CounterValue, float64(timeMisc)/picoSeconds,
eventName, "misc",
)
}
return nil
}
// check interface
var _ Scraper = ScrapePerfFileEvents{}