-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathmain.go
124 lines (101 loc) · 4.87 KB
/
main.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
package main
import (
"context"
"runtime"
"github.com/JorritSalverda/jarvis-modbus-exporter/client/bigquery"
"github.com/JorritSalverda/jarvis-modbus-exporter/client/config"
"github.com/JorritSalverda/jarvis-modbus-exporter/client/modbus"
"github.com/JorritSalverda/jarvis-modbus-exporter/client/state"
"github.com/alecthomas/kingpin"
foundation "github.com/estafette/estafette-foundation"
"github.com/rs/zerolog/log"
"k8s.io/client-go/kubernetes"
"k8s.io/client-go/rest"
)
var (
// set when building the application
appgroup string
app string
version string
branch string
revision string
buildDate string
goVersion = runtime.Version()
// application specific config
modbusHostIPAddress = kingpin.Flag("modbus-host-ip", "Host ip address ofmodbus").Default("127.0.0.1").OverrideDefaultFromEnvar("MODBUS_HOST_IP").String()
modbusHostPort = kingpin.Flag("modbus-host-port", "Host port of modbus").Default("502").OverrideDefaultFromEnvar("MODBUS_HOST_PORT").Int()
modbusUnitID = kingpin.Flag("modbus-unit-id", "ModBus unit id of modbus").Default("3").OverrideDefaultFromEnvar("MODBUS_UNIT_ID").Int()
bigqueryEnable = kingpin.Flag("bigquery-enable", "Toggle to enable or disable bigquery integration").Default("true").OverrideDefaultFromEnvar("BQ_ENABLE").Bool()
bigqueryInit = kingpin.Flag("bigquery-init", "Toggle to enable bigquery table initialization").Default("true").OverrideDefaultFromEnvar("BQ_INIT").Bool()
bigqueryProjectID = kingpin.Flag("bigquery-project-id", "Google Cloud project id that contains the BigQuery dataset").Envar("BQ_PROJECT_ID").Required().String()
bigqueryDataset = kingpin.Flag("bigquery-dataset", "Name of the BigQuery dataset").Envar("BQ_DATASET").Required().String()
bigqueryTable = kingpin.Flag("bigquery-table", "Name of the BigQuery table").Envar("BQ_TABLE").Required().String()
configPath = kingpin.Flag("config-path", "Path to the config.yaml file").Default("/configs/config.yaml").OverrideDefaultFromEnvar("CONFIG_PATH").String()
measurementFilePath = kingpin.Flag("state-file-path", "Path to file with state.").Default("/configs/last-measurement.json").OverrideDefaultFromEnvar("MEASUREMENT_FILE_PATH").String()
measurementFileConfigMapName = kingpin.Flag("state-file-configmap-name", "Name of the configmap with state file.").Default("jarvis-modbus-exporter").OverrideDefaultFromEnvar("MEASUREMENT_FILE_CONFIG_MAP_NAME").String()
)
func main() {
// parse command line parameters
kingpin.Parse()
// init log format from envvar ESTAFETTE_LOG_FORMAT
foundation.InitLoggingFromEnv(foundation.NewApplicationInfo(appgroup, app, version, branch, revision, buildDate))
// create context to cancel commands on sigterm
ctx := foundation.InitCancellationContext(context.Background())
configClient, err := config.NewClient(ctx)
if err != nil {
log.Fatal().Err(err).Msg("Failed creating config.Client")
}
// read config from yaml file
config, err := configClient.ReadConfigFromFile(ctx, *configPath)
if err != nil {
log.Fatal().Err(err).Msgf("Failed loading config from %v", *configPath)
}
log.Info().Interface("config", config).Msgf("Loaded config from %v", *configPath)
// init bigquery client
bigqueryClient, err := bigquery.NewClient(ctx, *bigqueryProjectID, *bigqueryEnable)
if err != nil {
log.Fatal().Err(err).Msg("Failed creating bigquery.Client")
}
// init bigquery table if it doesn't exist yet
if *bigqueryInit {
err = bigqueryClient.InitBigqueryTable(ctx, *bigqueryDataset, *bigqueryTable)
if err != nil {
log.Fatal().Err(err).Msg("Failed initializing bigquery table")
}
}
// create kubernetes api client
kubeClientConfig, err := rest.InClusterConfig()
if err != nil {
log.Fatal().Err(err)
}
// creates the clientset
kubeClientset, err := kubernetes.NewForConfig(kubeClientConfig)
if err != nil {
log.Fatal().Err(err)
}
stateClient, err := state.NewClient(ctx, kubeClientset, *measurementFilePath, *measurementFileConfigMapName)
if err != nil {
log.Fatal().Err(err).Msg("Failed creating state client")
}
modbusClient, err := modbus.NewClient(ctx, *modbusHostIPAddress, *modbusHostPort, *modbusUnitID)
if err != nil {
log.Fatal().Err(err).Msg("Failed creating modbus client")
}
lastMeasurement, err := stateClient.ReadState(ctx)
if err != nil {
log.Fatal().Err(err).Msg("Failed reading last state")
}
measurement, err := modbusClient.GetMeasurement(ctx, config, lastMeasurement)
if err != nil {
log.Fatal().Err(err).Msg("Failed getting measurement")
}
err = bigqueryClient.InsertMeasurement(ctx, *bigqueryDataset, *bigqueryTable, measurement)
if err != nil {
log.Fatal().Err(err).Msg("Failed inserting measurements into bigquery table")
}
err = stateClient.StoreState(ctx, measurement)
if err != nil {
log.Fatal().Err(err).Msg("Failed storing measurements in state file")
}
log.Info().Msgf("Stored %v samples, exiting...", len(measurement.Samples))
}