Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
37 commits
Select commit Hold shift + click to select a range
0e06478
added counter type metrics
lcorsini Sep 2, 2020
f3ba1ae
fixed array naming
lcorsini Sep 2, 2020
5d03229
Merge pull request #1 from lcorsini/counter-query
lcorsini Sep 2, 2020
7990b15
Merge pull request #2 from m-lab/main
lcorsini Mar 15, 2021
a5f583c
Add possibility to set a minimun interval time between the collector …
skyacquinob Mar 16, 2021
2e03db9
Merge pull request #3 from braquino/config_schedule
lcorsini Mar 16, 2021
7e73877
Revert "Add possibility to set a minimun time interval between the co…
lcorsini Mar 19, 2021
58a06c2
Merge pull request #5 from lcorsini/revert-3-config_schedule
lcorsini Mar 19, 2021
82f6cdf
Merge branch 'm-lab:main' into master
lcorsini Aug 17, 2021
0d1e225
removed todo
lcorsini Aug 17, 2021
0bb6db3
added example config file
lcorsini Aug 17, 2021
7c9146d
added config file modifications
lcorsini Aug 18, 2021
15c7b0a
add configuration unmarshalling
Aug 18, 2021
e8d73fc
fix unmarshalling
Aug 18, 2021
e8e4c6b
comment test and print log message
Aug 18, 2021
97a803d
print configuration structure
Aug 18, 2021
66499b7
added Debug log
lcorsini Aug 18, 2021
f3e2d70
added project to config file
lcorsini Aug 18, 2021
8eda87e
resolving warning on struct
Aug 18, 2021
97d4dab
add isModified feature on configuration file struct
Aug 18, 2021
f6f92c2
propagation of the configuration file modification
Aug 18, 2021
268cb4a
add mutex for modified state
Aug 18, 2021
2eec606
update gitignore
Aug 18, 2021
78c3f3d
add unregistering sql collectors method
Aug 18, 2021
9839ea7
removing useless stuff
Aug 18, 2021
cc936dc
panic if something wrong occurs during deregistration
Aug 18, 2021
fd836fb
updated chart to add debug log level
lcorsini Aug 19, 2021
57631dd
mac os gitignore
lcorsini Aug 19, 2021
a7cd454
updated gitignore
lcorsini Aug 19, 2021
a8a1370
added counterSources to tests
lcorsini Aug 19, 2021
563ddfa
Merge branch 'master' into cfg_file
lcorsini Aug 19, 2021
e627027
moved chart to different repo
lcorsini Aug 20, 2021
0c858f4
Revert project name from config file to command line argument
lcorsini Aug 20, 2021
9e8d538
updated from main
lcorsini Sep 22, 2022
c6c78df
Merge pull request #12 from lcorsini/m-lab-main
lcorsini Sep 22, 2022
5e3d468
Merge pull request #9 from lcorsini/cfg_file
lcorsini Sep 22, 2022
8b9011c
Update README.md
lcorsini Sep 22, 2022
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
31 changes: 31 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
@@ -1 +1,32 @@
# General
.DS_Store
.AppleDouble
.LSOverride

# Icon must end with two \r
Icon

# Thumbnails
._*

# Files that might appear in the root of a volume
.DocumentRevisions-V100
.fseventsd
.Spotlight-V100
.TemporaryItems
.Trashes
.VolumeIcon.icns
.com.apple.timemachine.donotpresent

# Directories potentially created on remote AFP share
.AppleDB
.AppleDesktop
Network Trash Folder
Temporary Items
.apdisk


/prometheus-bigquery-exporter
config.yaml
/queries
credentials.json
3 changes: 3 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,9 @@

An exporter for converting BigQuery results into Prometheus metrics.

This Fork adds a config file for multiple queries and Counter type metrics


## Limitations: No historical values

Prometheus collects the *current* status of a system as reported by an exporter.
Expand Down
9 changes: 9 additions & 0 deletions configuration/example_config.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
project: "skyita-da-logging-noprod"
gauge-queries:
- query:
file: "/queries/metric1_name.sql"
#refresh "*/5 * * * *" #every 5 minutes by default
counter-queries:
- query:
file: "/queries/metric2_name.sql"
#refresh "30 9 * * *" #every day at 9:30
Empty file added configuration/test/test_0.yml
Empty file.
13 changes: 13 additions & 0 deletions configuration/test/test_1.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
project: "abc"
gauge-queries:
- query: "abc"
file: "/queries/metric1_name.sql"
- query: "def"
file: "/queries/metric2_name.sql"
counter-queries:
- query: "abc_2"
file: "/queries/metric3_name.sql"
- query: "def_2"
file: "/queries/metric4_name.sql"
- query: "ghi_2"
file: "/queries/metric5_name.sql"
9 changes: 9 additions & 0 deletions configuration/test/test_2.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
project: "abc"
gauge-queries:
counter-queries:
- query: "abc_2"
file: "/queries/metric3_name.sql"
- query: "def_2"
file: "/queries/metric4_name.sql"
- query: "ghi_2"
file: "/queries/metric5_name.sql"
7 changes: 7 additions & 0 deletions configuration/test/test_3.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
project: "abc"
gauge-queries:
- query: "abc"
file: "/queries/metric1_name.sql"
- query: "def"
file: "/queries/metric2_name.sql"
counter-queries:
1 change: 1 addition & 0 deletions go.mod
Original file line number Diff line number Diff line change
Expand Up @@ -41,3 +41,4 @@ require (
gopkg.in/yaml.v2 v2.3.0 // indirect
honnef.co/go/tools v0.0.1-2019.2.3 // indirect
)

3 changes: 3 additions & 0 deletions go.sum
Original file line number Diff line number Diff line change
Expand Up @@ -103,8 +103,10 @@ github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+o
github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ=
github.com/kr/logfmt v0.0.0-20140226030751-b84e30acd515/go.mod h1:+0opPa2QZZtGFBFZlji/RkVcI2GknAs/DXo4wKdlNEc=
github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo=
github.com/kr/pretty v0.2.0 h1:s5hAObm+yFO5uHYt5dYjxi2rXrsnmRpJx4OYvIWUaQs=
github.com/kr/pretty v0.2.0/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI=
github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ=
github.com/kr/text v0.1.0 h1:45sCR5RtlFHMR4UwH9sdQ5TC8v0qDQCHnXt+kaKSTVE=
github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI=
github.com/m-lab/go v1.4.0 h1:Au2Vt15+H8oOd3xYZFfW3gK86GRciKlfGJs/FzsJwK4=
github.com/m-lab/go v1.4.0/go.mod h1:f22d1CtoFIho8yt0wPNYo0Lx5h8YfgRW4+1pzQTeQRw=
Expand Down Expand Up @@ -309,6 +311,7 @@ google.golang.org/protobuf v1.22.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2
gopkg.in/alecthomas/kingpin.v2 v2.2.6/go.mod h1:FMv+mEhP44yOT+4EoQTLFTRgOQ1FBLkstjWtayDeSgw=
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15 h1:YR8cESwS4TdDjEe65xsg0ogRM/Nc3DYOhEAlW+xobZo=
gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
gopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI=
gopkg.in/yaml.v2 v2.2.1/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
Expand Down
111 changes: 111 additions & 0 deletions internal/config/config.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,111 @@
package config

import (
"fmt"
"log"
"os"

"github.com/m-lab/go/logx"
"github.com/spf13/afero"
"gopkg.in/yaml.v2"
)

var fs = afero.NewOsFs()

type Config struct {
Name string `yaml:"-"`
stat os.FileInfo `yaml:"-"`
Gauge []Query `yaml:"gauge-queries"`
Counter []Query `yaml:"counter-queries"`
}

type Query struct {
Query string `yaml:"query"`
File string `yaml:"file"`
}

func (cfg *Config) GetGaugeFiles() []string {

var paths []string
for _, path := range cfg.Gauge {

paths = append(paths, path.File)
}
return paths
}

func (cfg *Config) IsModified() (bool, error) {

var err error
if cfg.stat == nil {
cfg.stat, err = fs.Stat(cfg.Name)
logx.Debug.Println("IsModified:stat1:", cfg.Name, err)
// Return true on the first successful Stat(), or the error otherwise.
return err == nil, err
}
curr, err := fs.Stat(cfg.Name)
if err != nil {
log.Printf("Failed to stat %q: %v", cfg.Name, err)
return false, err
}
logx.Debug.Println("IsModified:stat2:", cfg.Name, curr.ModTime(), cfg.stat.ModTime(),
curr.ModTime().After(cfg.stat.ModTime()))
modified := curr.ModTime().After(cfg.stat.ModTime())
if modified {
// Update the stat cache to the latest version.
cfg.stat = curr
}
return modified, nil
}

func (cfg *Config) GetCounterFiles() []string {

var paths []string
for _, path := range cfg.Counter {

paths = append(paths, path.File)
}
return paths
}

func ReadConfigFile(path string) (*Config, error) {

f, err := os.Open(path)
if err != nil {
return nil, fmt.Errorf("something wrong during file opening: %s", err.Error())
}

defer f.Close()

var cfg Config
decoder := yaml.NewDecoder(f)
err = decoder.Decode(&cfg)
if err != nil {
return nil, fmt.Errorf("something wrong during configuration unmarshalling: %s", err.Error())
}

err = validate(&cfg)
if err != nil {
return nil, err
}

cfg.Name = path
cfg.stat, err = fs.Stat(cfg.Name)
if err != nil {
return nil, fmt.Errorf("something wrong during file stat extraction: %s", err.Error())
}

return &cfg, nil
}

func validate(cfg *Config) error {

if len(cfg.Counter) == 0 {
return fmt.Errorf("no Counter parameters available")
}

if len(cfg.Gauge) == 0 {
return fmt.Errorf("no Gauge parameters available")
}
return nil
}
64 changes: 64 additions & 0 deletions internal/config/config_test.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,64 @@
package config

import (
"testing"

"github.com/stretchr/testify/assert"
)

func TestReadConfigFile__good(t *testing.T) {

result, err := ReadConfigFile("../../configuration/test/test_1.yml")
assert.Nil(t, err)
assert.Equal(t, 2, len(result.Gauge))

gaugeQuery0 := result.Gauge[0]
assert.Equal(t, "abc", gaugeQuery0.Query)
assert.Equal(t, "/queries/metric1_name.sql", gaugeQuery0.File)

gaugeQuery1 := result.Gauge[1]
assert.Equal(t, "def", gaugeQuery1.Query)
assert.Equal(t, "/queries/metric2_name.sql", gaugeQuery1.File)

assert.Equal(t, 3, len(result.Counter))

counterQuery0 := result.Counter[0]
assert.Equal(t, "abc_2", counterQuery0.Query)
assert.Equal(t, "/queries/metric3_name.sql", counterQuery0.File)

counterQuery1 := result.Counter[1]
assert.Equal(t, "def_2", counterQuery1.Query)
assert.Equal(t, "/queries/metric4_name.sql", counterQuery1.File)

counterQuery2 := result.Counter[2]
assert.Equal(t, "ghi_2", counterQuery2.Query)
assert.Equal(t, "/queries/metric5_name.sql", counterQuery2.File)
}

func TestReadConfigFile__empty_file(t *testing.T) {

_, err := ReadConfigFile("../../configuration/test/test_0.yml")
assert.NotNil(t, err)
assert.Equal(t, "something wrong during configuration unmarshalling: EOF", err.Error())
}

func TestReadConfigFile__no_counter_parameters(t *testing.T) {

_, err := ReadConfigFile("../../configuration/test/test_3.yml")
assert.NotNil(t, err)
assert.Equal(t, "no Counter parameters available", err.Error())
}

func TestReadConfigFile__no_gauge_parameters(t *testing.T) {

_, err := ReadConfigFile("../../configuration/test/test_2.yml")
assert.NotNil(t, err)
assert.Equal(t, "no Gauge parameters available", err.Error())
}

func TestReadConfigFile__wrong_path(t *testing.T) {

_, err := ReadConfigFile("../../not/existing/path")
assert.NotNil(t, err)
assert.Equal(t, "something wrong during file opening: open ../../not/existing/path: no such file or directory", err.Error())
}
10 changes: 10 additions & 0 deletions internal/setup/setup.go
Original file line number Diff line number Diff line change
Expand Up @@ -71,6 +71,16 @@ func (f *File) Register(c *sql.Collector) error {
return c.RegisterErr
}

func (f *File) Unregister() error {

unregitered := prometheus.Unregister(f.c)
if !unregitered {
return fmt.Errorf("something wrong during unregistering of sql collector of file: %s", f.Name)
}
logx.Debug.Println("Unregister:", f.Name, f.c.RegisterErr)
return nil
}

// Update runs the collector query again.
func (f *File) Update() error {
if f.c != nil {
Expand Down
Loading