mirror of
https://github.com/Oxalide/vsphere-influxdb-go.git
synced 2023-10-10 13:36:51 +02:00
merge
This commit is contained in:
commit
8b34784692
13
.gitignore
vendored
Normal file
13
.gitignore
vendored
Normal file
@ -0,0 +1,13 @@
|
|||||||
|
### Basic ignore file
|
||||||
|
|
||||||
|
# Binaries for programs and plugins
|
||||||
|
vsphere-influxdb
|
||||||
|
|
||||||
|
# Test binary, build with `go test -c`
|
||||||
|
*.test
|
||||||
|
|
||||||
|
# Output of the go coverage tool, specifically when used with LiteIDE
|
||||||
|
*.out
|
||||||
|
|
||||||
|
# Configuration file
|
||||||
|
vsphere-influxdb.json
|
@ -45,9 +45,9 @@ To see all available metrics, check out [this](http://www.virten.net/2015/05/vsp
|
|||||||
Note: Not all metrics are available directly, you might need to change your metric collection level.
|
Note: Not all metrics are available directly, you might need to change your metric collection level.
|
||||||
A table with the level needed for each metric is availble [here](http://www.virten.net/2015/05/which-performance-counters-are-available-in-each-statistic-level/), and you can find a PowerCLI script that changes the collect level [here](http://www.valcolabs.com/2012/02/06/modify-historical-statistics-level-using-powercli/)
|
A table with the level needed for each metric is availble [here](http://www.virten.net/2015/05/which-performance-counters-are-available-in-each-statistic-level/), and you can find a PowerCLI script that changes the collect level [here](http://www.valcolabs.com/2012/02/06/modify-historical-statistics-level-using-powercli/)
|
||||||
|
|
||||||
An example of configuration file is [here](./vsphere-influxdb-go.json).
|
An example of configuration file is [here](./vsphere-influxdb.json.sample).
|
||||||
|
|
||||||
You need to place it at /etc/*binaryname*.json (/etc/vsphere-influxdb-go.json by default)
|
You need to place it at /etc/*binaryname*.json (/etc/vsphere-influxdb.json by default) or you can specify a different location using the config flag.
|
||||||
|
|
||||||
|
|
||||||
# Run as a service
|
# Run as a service
|
||||||
|
@ -47,7 +47,7 @@ const (
|
|||||||
description = "send vsphere stats to influxdb"
|
description = "send vsphere stats to influxdb"
|
||||||
)
|
)
|
||||||
|
|
||||||
// Configuration
|
// Configuration is used to store config data
|
||||||
type Configuration struct {
|
type Configuration struct {
|
||||||
VCenters []*VCenter
|
VCenters []*VCenter
|
||||||
Metrics []Metric
|
Metrics []Metric
|
||||||
@ -56,7 +56,7 @@ type Configuration struct {
|
|||||||
InfluxDB InfluxDB
|
InfluxDB InfluxDB
|
||||||
}
|
}
|
||||||
|
|
||||||
// InfluxDB description
|
// InfluxDB is used for InfluxDB connections
|
||||||
type InfluxDB struct {
|
type InfluxDB struct {
|
||||||
Hostname string
|
Hostname string
|
||||||
Username string
|
Username string
|
||||||
@ -64,7 +64,7 @@ type InfluxDB struct {
|
|||||||
Database string
|
Database string
|
||||||
}
|
}
|
||||||
|
|
||||||
// VCenter description
|
// VCenter for VMware vCenter connections
|
||||||
type VCenter struct {
|
type VCenter struct {
|
||||||
Hostname string
|
Hostname string
|
||||||
Username string
|
Username string
|
||||||
@ -72,30 +72,30 @@ type VCenter struct {
|
|||||||
MetricGroups []*MetricGroup
|
MetricGroups []*MetricGroup
|
||||||
}
|
}
|
||||||
|
|
||||||
// Metric Definition
|
// MetricDef metric definition
|
||||||
type MetricDef struct {
|
type MetricDef struct {
|
||||||
Metric string
|
Metric string
|
||||||
Instances string
|
Instances string
|
||||||
Key int32
|
Key int32
|
||||||
}
|
}
|
||||||
|
|
||||||
// Metrics description in config
|
var vmRefs []types.ManagedObjectReference
|
||||||
var vm_refs []types.ManagedObjectReference
|
|
||||||
var debug bool
|
var debug bool
|
||||||
|
|
||||||
|
// Metric is used for metrics retrieval
|
||||||
type Metric struct {
|
type Metric struct {
|
||||||
ObjectType []string
|
ObjectType []string
|
||||||
Definition []MetricDef
|
Definition []MetricDef
|
||||||
}
|
}
|
||||||
|
|
||||||
// Metric Grouping for retrieval
|
// MetricGroup is used for grouping metrics retrieval
|
||||||
type MetricGroup struct {
|
type MetricGroup struct {
|
||||||
ObjectType string
|
ObjectType string
|
||||||
Metrics []MetricDef
|
Metrics []MetricDef
|
||||||
Mor []types.ManagedObjectReference
|
Mor []types.ManagedObjectReference
|
||||||
}
|
}
|
||||||
|
|
||||||
// Informations to query about an entity
|
// EntityQuery are informations to query about an entity
|
||||||
type EntityQuery struct {
|
type EntityQuery struct {
|
||||||
Name string
|
Name string
|
||||||
Entity types.ManagedObjectReference
|
Entity types.ManagedObjectReference
|
||||||
@ -107,6 +107,7 @@ var dependencies = []string{}
|
|||||||
|
|
||||||
var stdlog, errlog *log.Logger
|
var stdlog, errlog *log.Logger
|
||||||
|
|
||||||
|
// Connect to the actual vCenter connection used to query data
|
||||||
func (vcenter *VCenter) Connect() (*govmomi.Client, error) {
|
func (vcenter *VCenter) Connect() (*govmomi.Client, error) {
|
||||||
// Prepare vCenter Connections
|
// Prepare vCenter Connections
|
||||||
ctx, cancel := context.WithCancel(context.Background())
|
ctx, cancel := context.WithCancel(context.Background())
|
||||||
@ -127,7 +128,7 @@ func (vcenter *VCenter) Connect() (*govmomi.Client, error) {
|
|||||||
return client, nil
|
return client, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
// Initialise vcenter
|
// Init the VCenter connection
|
||||||
func (vcenter *VCenter) Init(config Configuration) {
|
func (vcenter *VCenter) Init(config Configuration) {
|
||||||
ctx, cancel := context.WithCancel(context.Background())
|
ctx, cancel := context.WithCancel(context.Background())
|
||||||
defer cancel()
|
defer cancel()
|
||||||
@ -245,36 +246,37 @@ func (vcenter *VCenter) Query(config Configuration, InfluxDBClient influxclient.
|
|||||||
mors = append(mors, containerView.View...)
|
mors = append(mors, containerView.View...)
|
||||||
}
|
}
|
||||||
// Create MORS for each object type
|
// Create MORS for each object type
|
||||||
vm_refs := []types.ManagedObjectReference{}
|
|
||||||
host_refs := []types.ManagedObjectReference{}
|
|
||||||
cluster_refs := []types.ManagedObjectReference{}
|
|
||||||
respool_refs := []types.ManagedObjectReference{}
|
|
||||||
|
|
||||||
new_mors := []types.ManagedObjectReference{}
|
vmRefs := []types.ManagedObjectReference{}
|
||||||
|
hostRefs := []types.ManagedObjectReference{}
|
||||||
|
clusterRefs := []types.ManagedObjectReference{}
|
||||||
|
respoolRefs := []types.ManagedObjectReference{}
|
||||||
|
|
||||||
|
newMors := []types.ManagedObjectReference{}
|
||||||
|
|
||||||
spew.Dump(mors)
|
spew.Dump(mors)
|
||||||
// Assign each MORS type to a specific array
|
// Assign each MORS type to a specific array
|
||||||
for _, mor := range mors {
|
for _, mor := range mors {
|
||||||
if mor.Type == "VirtualMachine" {
|
if mor.Type == "VirtualMachine" {
|
||||||
vm_refs = append(vm_refs, mor)
|
vmRefs = append(vmRefs, mor)
|
||||||
new_mors = append(new_mors, mor)
|
newMors = append(newMors, mor)
|
||||||
} else if mor.Type == "HostSystem" {
|
} else if mor.Type == "HostSystem" {
|
||||||
host_refs = append(host_refs, mor)
|
hostRefs = append(hostRefs, mor)
|
||||||
new_mors = append(new_mors, mor)
|
newMors = append(newMors, mor)
|
||||||
} else if mor.Type == "ClusterComputeResource" {
|
} else if mor.Type == "ClusterComputeResource" {
|
||||||
cluster_refs = append(cluster_refs, mor)
|
clusterRefs = append(cluster_refs, mor)
|
||||||
} else if mor.Type == "ResourcePool" {
|
} else if mor.Type == "ResourcePool" {
|
||||||
respool_refs = append(respool_refs, mor)
|
respoolRefs = append(respool_refs, mor)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
// Copy the mors without the clusters
|
// Copy the mors without the clusters
|
||||||
mors = new_mors
|
mors = newMors
|
||||||
|
|
||||||
pc := property.DefaultCollector(client.Client)
|
pc := property.DefaultCollector(client.Client)
|
||||||
|
|
||||||
// Retrieve properties for all vms
|
// Retrieve properties for all vms
|
||||||
var vmmo []mo.VirtualMachine
|
var vmmo []mo.VirtualMachine
|
||||||
err = pc.Retrieve(ctx, vm_refs, []string{"summary"}, &vmmo)
|
err = pc.Retrieve(ctx, vmRefs, []string{"summary"}, &vmmo)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
fmt.Println(err)
|
fmt.Println(err)
|
||||||
return
|
return
|
||||||
@ -282,7 +284,7 @@ func (vcenter *VCenter) Query(config Configuration, InfluxDBClient influxclient.
|
|||||||
|
|
||||||
// Retrieve properties for hosts
|
// Retrieve properties for hosts
|
||||||
var hsmo []mo.HostSystem
|
var hsmo []mo.HostSystem
|
||||||
err = pc.Retrieve(ctx, host_refs, []string{"summary"}, &hsmo)
|
err = pc.Retrieve(ctx, hostRefs, []string{"summary"}, &hsmo)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
fmt.Println(err)
|
fmt.Println(err)
|
||||||
return
|
return
|
||||||
@ -290,7 +292,7 @@ func (vcenter *VCenter) Query(config Configuration, InfluxDBClient influxclient.
|
|||||||
|
|
||||||
//Retrieve properties for ResourcePool
|
//Retrieve properties for ResourcePool
|
||||||
var rpmo []mo.ResourcePool
|
var rpmo []mo.ResourcePool
|
||||||
err = pc.Retrieve(ctx, respool_refs, []string{"summary"}, &rpmo)
|
err = pc.Retrieve(ctx, respoolRefs, []string{"summary"}, &rpmo)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
fmt.Println(err)
|
fmt.Println(err)
|
||||||
return
|
return
|
||||||
@ -300,7 +302,7 @@ func (vcenter *VCenter) Query(config Configuration, InfluxDBClient influxclient.
|
|||||||
vmToPool := make(map[types.ManagedObjectReference]string)
|
vmToPool := make(map[types.ManagedObjectReference]string)
|
||||||
|
|
||||||
// Retrieve properties for ResourcePools
|
// Retrieve properties for ResourcePools
|
||||||
if len(respool_refs) > 0 {
|
if len(respoolRefs) > 0 {
|
||||||
if debug == true {
|
if debug == true {
|
||||||
stdlog.Println("going inside ResourcePools")
|
stdlog.Println("going inside ResourcePools")
|
||||||
}
|
}
|
||||||
@ -331,12 +333,12 @@ func (vcenter *VCenter) Query(config Configuration, InfluxDBClient influxclient.
|
|||||||
vmToCluster := make(map[types.ManagedObjectReference]string)
|
vmToCluster := make(map[types.ManagedObjectReference]string)
|
||||||
|
|
||||||
// Retrieve properties for clusters, if any
|
// Retrieve properties for clusters, if any
|
||||||
if len(cluster_refs) > 0 {
|
if len(clusterRefs) > 0 {
|
||||||
if debug == true {
|
if debug == true {
|
||||||
stdlog.Println("going inside clusters")
|
stdlog.Println("going inside clusters")
|
||||||
}
|
}
|
||||||
var clmo []mo.ClusterComputeResource
|
var clmo []mo.ClusterComputeResource
|
||||||
err = pc.Retrieve(ctx, cluster_refs, []string{"name", "configuration"}, &clmo)
|
err = pc.Retrieve(ctx, clusterRefs, []string{"name", "configuration"}, &clmo)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
fmt.Println(err)
|
fmt.Println(err)
|
||||||
return
|
return
|
||||||
@ -345,7 +347,7 @@ func (vcenter *VCenter) Query(config Configuration, InfluxDBClient influxclient.
|
|||||||
if debug == true {
|
if debug == true {
|
||||||
stdlog.Println("---cluster name - you should see every cluster here---")
|
stdlog.Println("---cluster name - you should see every cluster here---")
|
||||||
stdlog.Println(cl.Name)
|
stdlog.Println(cl.Name)
|
||||||
stdlog.Println("You should see the cluster object, clsuter configuration object, and cluster configuration dasvmconfig which should contain all VMs")
|
stdlog.Println("You should see the cluster object, cluster configuration object, and cluster configuration dasvmconfig which should contain all VMs")
|
||||||
spew.Dump(cl)
|
spew.Dump(cl)
|
||||||
spew.Dump(cl.Configuration)
|
spew.Dump(cl.Configuration)
|
||||||
spew.Dump(cl.Configuration.DasVmConfig)
|
spew.Dump(cl.Configuration.DasVmConfig)
|
||||||
@ -369,35 +371,35 @@ func (vcenter *VCenter) Query(config Configuration, InfluxDBClient influxclient.
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Retrieve properties for the hosts
|
// Retrieve properties for the hosts
|
||||||
host_summary := make(map[types.ManagedObjectReference]map[string]string)
|
hostSummary := make(map[types.ManagedObjectReference]map[string]string)
|
||||||
host_extra_metrics := make(map[types.ManagedObjectReference]map[string]int64)
|
hostExtraMetrics := make(map[types.ManagedObjectReference]map[string]int64)
|
||||||
|
|
||||||
for _, host := range hsmo {
|
for _, host := range hsmo {
|
||||||
host_summary[host.Self] = make(map[string]string)
|
hostSummary[host.Self] = make(map[string]string)
|
||||||
host_summary[host.Self]["name"] = host.Summary.Config.Name
|
hostSummary[host.Self]["name"] = host.Summary.Config.Name
|
||||||
host_extra_metrics[host.Self] = make(map[string]int64)
|
hostExtraMetrics[host.Self] = make(map[string]int64)
|
||||||
host_extra_metrics[host.Self]["cpu_corecount_total"] = int64(host.Summary.Hardware.NumCpuThreads)
|
hostExtraMetrics[host.Self]["cpu_corecount_total"] = int64(host.Summary.Hardware.NumCpuThreads)
|
||||||
}
|
}
|
||||||
|
|
||||||
// Initialize the map that will hold all extra tags
|
// Initialize the map that will hold all extra tags
|
||||||
vm_summary := make(map[types.ManagedObjectReference]map[string]string)
|
vmSummary := make(map[types.ManagedObjectReference]map[string]string)
|
||||||
|
|
||||||
// Assign extra details per VM in vm_summary
|
// Assign extra details per VM in vmSummary
|
||||||
for _, vm := range vmmo {
|
for _, vm := range vmmo {
|
||||||
vm_summary[vm.Self] = make(map[string]string)
|
vmSummary[vm.Self] = make(map[string]string)
|
||||||
// Ugly way to extract datastore value
|
// Ugly way to extract datastore value
|
||||||
re, err := regexp.Compile(`\[(.*?)\]`)
|
re, err := regexp.Compile(`\[(.*?)\]`)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
fmt.Println(err)
|
fmt.Println(err)
|
||||||
}
|
}
|
||||||
vm_summary[vm.Self]["datastore"] = strings.Replace(strings.Replace(re.FindString(fmt.Sprintln(vm.Summary.Config)), "[", "", -1), "]", "", -1)
|
vmSummary[vm.Self]["datastore"] = strings.Replace(strings.Replace(re.FindString(fmt.Sprintln(vm.Summary.Config)), "[", "", -1), "]", "", -1)
|
||||||
if vmToCluster[vm.Self] != "" {
|
if vmToCluster[vm.Self] != "" {
|
||||||
vm_summary[vm.Self]["cluster"] = vmToCluster[vm.Self]
|
vmSummary[vm.Self]["cluster"] = vmToCluster[vm.Self]
|
||||||
}
|
}
|
||||||
if vmToPool[vm.Self] != "" {
|
if vmToPool[vm.Self] != "" {
|
||||||
vm_summary[vm.Self]["respool"] = vmToPool[vm.Self]
|
vmsummary[vm.Self]["respool"] = vmToPool[vm.Self]
|
||||||
}
|
}
|
||||||
vm_summary[vm.Self]["esx"] = host_summary[*vm.Summary.Runtime.Host]["name"]
|
vmsummary[vm.Self]["esx"] = host_summary[*vm.Summary.Runtime.Host]["name"]
|
||||||
}
|
}
|
||||||
|
|
||||||
// get object names
|
// get object names
|
||||||
@ -446,9 +448,9 @@ func (vcenter *VCenter) Query(config Configuration, InfluxDBClient influxclient.
|
|||||||
queries := []types.PerfQuerySpec{}
|
queries := []types.PerfQuerySpec{}
|
||||||
|
|
||||||
// Common parameters
|
// Common parameters
|
||||||
intervalIdint := 20
|
intervalIDint := 20
|
||||||
var intervalId int32
|
var intervalID int32
|
||||||
intervalId = int32(intervalIdint)
|
intervalID = int32(intervalIDint)
|
||||||
|
|
||||||
endTime := time.Now().Add(time.Duration(-1) * time.Second)
|
endTime := time.Now().Add(time.Duration(-1) * time.Second)
|
||||||
startTime := endTime.Add(time.Duration(-config.Interval) * time.Second)
|
startTime := endTime.Add(time.Duration(-config.Interval) * time.Second)
|
||||||
@ -463,7 +465,7 @@ func (vcenter *VCenter) Query(config Configuration, InfluxDBClient influxclient.
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
queries = append(queries, types.PerfQuerySpec{Entity: mor, StartTime: &startTime, EndTime: &endTime, MetricId: metricIds, IntervalId: intervalId})
|
queries = append(queries, types.PerfQuerySpec{Entity: mor, StartTime: &startTime, EndTime: &endTime, MetricId: metricIds, IntervalId: intervalID})
|
||||||
}
|
}
|
||||||
|
|
||||||
// Query the performances
|
// Query the performances
|
||||||
@ -499,12 +501,12 @@ func (vcenter *VCenter) Query(config Configuration, InfluxDBClient influxclient.
|
|||||||
tags := map[string]string{"host": vcName, "name": name}
|
tags := map[string]string{"host": vcName, "name": name}
|
||||||
|
|
||||||
// Add extra per VM tags
|
// Add extra per VM tags
|
||||||
if summary, ok := vm_summary[pem.Entity]; ok {
|
if summary, ok := vmSummary[pem.Entity]; ok {
|
||||||
for key, tag := range summary {
|
for key, tag := range summary {
|
||||||
tags[key] = tag
|
tags[key] = tag
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if summary, ok := host_summary[pem.Entity]; ok {
|
if summary, ok := hostSummary[pem.Entity]; ok {
|
||||||
for key, tag := range summary {
|
for key, tag := range summary {
|
||||||
tags[key] = tag
|
tags[key] = tag
|
||||||
}
|
}
|
||||||
@ -516,8 +518,8 @@ func (vcenter *VCenter) Query(config Configuration, InfluxDBClient influxclient.
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
special_fields := make(map[string]map[string]map[string]map[string]interface{})
|
specialFields := make(map[string]map[string]map[string]map[string]interface{})
|
||||||
special_tags := make(map[string]map[string]map[string]map[string]string)
|
specialTags := make(map[string]map[string]map[string]map[string]string)
|
||||||
nowTime := time.Now()
|
nowTime := time.Now()
|
||||||
for _, baseserie := range pem.Value {
|
for _, baseserie := range pem.Value {
|
||||||
serie := baseserie.(*types.PerfMetricIntSeries)
|
serie := baseserie.(*types.PerfMetricIntSeries)
|
||||||
@ -547,34 +549,34 @@ func (vcenter *VCenter) Query(config Configuration, InfluxDBClient influxclient.
|
|||||||
fields[influxMetricName] = value
|
fields[influxMetricName] = value
|
||||||
} else {
|
} else {
|
||||||
// init maps
|
// init maps
|
||||||
if special_fields[measurementName] == nil {
|
if specialFields[measurementName] == nil {
|
||||||
special_fields[measurementName] = make(map[string]map[string]map[string]interface{})
|
specialFields[measurementName] = make(map[string]map[string]map[string]interface{})
|
||||||
special_tags[measurementName] = make(map[string]map[string]map[string]string)
|
specialTags[measurementName] = make(map[string]map[string]map[string]string)
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if special_fields[measurementName][tags["name"]] == nil {
|
if specialFields[measurementName][tags["name"]] == nil {
|
||||||
special_fields[measurementName][tags["name"]] = make(map[string]map[string]interface{})
|
specialFields[measurementName][tags["name"]] = make(map[string]map[string]interface{})
|
||||||
special_tags[measurementName][tags["name"]] = make(map[string]map[string]string)
|
specialTags[measurementName][tags["name"]] = make(map[string]map[string]string)
|
||||||
}
|
}
|
||||||
|
|
||||||
if special_fields[measurementName][tags["name"]][instanceName] == nil {
|
if specialFields[measurementName][tags["name"]][instanceName] == nil {
|
||||||
special_fields[measurementName][tags["name"]][instanceName] = make(map[string]interface{})
|
specialFields[measurementName][tags["name"]][instanceName] = make(map[string]interface{})
|
||||||
special_tags[measurementName][tags["name"]][instanceName] = make(map[string]string)
|
specialTags[measurementName][tags["name"]][instanceName] = make(map[string]string)
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
special_fields[measurementName][tags["name"]][instanceName][influxMetricName] = value
|
specialFields[measurementName][tags["name"]][instanceName][influxMetricName] = value
|
||||||
|
|
||||||
for k, v := range tags {
|
for k, v := range tags {
|
||||||
special_tags[measurementName][tags["name"]][instanceName][k] = v
|
specialTags[measurementName][tags["name"]][instanceName][k] = v
|
||||||
}
|
}
|
||||||
special_tags[measurementName][tags["name"]][instanceName]["instance"] = instanceName
|
specialTags[measurementName][tags["name"]][instanceName]["instance"] = instanceName
|
||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if metrics, ok := host_extra_metrics[pem.Entity]; ok {
|
if metrics, ok := hostExtraMetrics[pem.Entity]; ok {
|
||||||
for key, value := range metrics {
|
for key, value := range metrics {
|
||||||
fields[key] = value
|
fields[key] = value
|
||||||
}
|
}
|
||||||
@ -587,10 +589,10 @@ func (vcenter *VCenter) Query(config Configuration, InfluxDBClient influxclient.
|
|||||||
}
|
}
|
||||||
bp.AddPoint(pt)
|
bp.AddPoint(pt)
|
||||||
|
|
||||||
for measurement, v := range special_fields {
|
for measurement, v := range specialFields {
|
||||||
for name, metric := range v {
|
for name, metric := range v {
|
||||||
for instance, value := range metric {
|
for instance, value := range metric {
|
||||||
pt2, err := influxclient.NewPoint(measurement, special_tags[measurement][name][instance], value, time.Now())
|
pt2, err := influxclient.NewPoint(measurement, specialTags[measurement][name][instance], value, time.Now())
|
||||||
if err != nil {
|
if err != nil {
|
||||||
errlog.Println(err)
|
errlog.Println(err)
|
||||||
}
|
}
|
||||||
@ -662,7 +664,7 @@ func max(n ...int64) int64 {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func sum(n ...int64) int64 {
|
func sum(n ...int64) int64 {
|
||||||
var total int64 = 0
|
var total int64
|
||||||
for _, i := range n {
|
for _, i := range n {
|
||||||
if i > 0 {
|
if i > 0 {
|
||||||
total += i
|
total += i
|
||||||
@ -672,12 +674,12 @@ func sum(n ...int64) int64 {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func average(n ...int64) int64 {
|
func average(n ...int64) int64 {
|
||||||
var total int64 = 0
|
var total int64
|
||||||
var count int64 = 0
|
var count int64
|
||||||
for _, i := range n {
|
for _, i := range n {
|
||||||
if i >= 0 {
|
if i >= 0 {
|
||||||
count += 1
|
count++
|
||||||
total += i
|
total++
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
favg := float64(total) / float64(count)
|
favg := float64(total) / float64(count)
|
||||||
@ -693,6 +695,7 @@ func queryVCenter(vcenter VCenter, config Configuration, InfluxDBClient influxcl
|
|||||||
func main() {
|
func main() {
|
||||||
|
|
||||||
flag.BoolVar(&debug, "debug", true, "Debug mode")
|
flag.BoolVar(&debug, "debug", true, "Debug mode")
|
||||||
|
var cfgFile = flag.String("config", "/etc/"+path.Base(os.Args[0])+".json", "Config file to use. Default is /etc/"+path.Base(os.Args[0])+".json")
|
||||||
flag.Parse()
|
flag.Parse()
|
||||||
|
|
||||||
stdlog = log.New(os.Stdout, "", log.Ldate|log.Ltime)
|
stdlog = log.New(os.Stdout, "", log.Ldate|log.Ltime)
|
||||||
@ -700,16 +703,16 @@ func main() {
|
|||||||
|
|
||||||
stdlog.Println("Starting :", path.Base(os.Args[0]))
|
stdlog.Println("Starting :", path.Base(os.Args[0]))
|
||||||
// read the configuration
|
// read the configuration
|
||||||
file, err := os.Open(path.Base(os.Args[0]) + ".json")
|
file, err := os.Open(*cfgFile)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
errlog.Println("Could not open configuration file")
|
errlog.Println("Could not open configuration file " + *cfgFile)
|
||||||
errlog.Println(err)
|
errlog.Println(err)
|
||||||
}
|
}
|
||||||
jsondec := json.NewDecoder(file)
|
jsondec := json.NewDecoder(file)
|
||||||
config := Configuration{}
|
config := Configuration{}
|
||||||
err = jsondec.Decode(&config)
|
err = jsondec.Decode(&config)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
errlog.Println("Could not decode configuration file")
|
errlog.Println("Could not decode configuration file " + *cfgFile)
|
||||||
errlog.Println(err)
|
errlog.Println(err)
|
||||||
|
|
||||||
}
|
}
|
||||||
@ -725,7 +728,7 @@ func main() {
|
|||||||
errlog.Println("Could not connect to InfluxDB")
|
errlog.Println("Could not connect to InfluxDB")
|
||||||
errlog.Println(err)
|
errlog.Println(err)
|
||||||
} else {
|
} else {
|
||||||
stdlog.Println("Successfully connected to Influx\n")
|
stdlog.Println("Successfully connected to Influx")
|
||||||
}
|
}
|
||||||
for _, vcenter := range config.VCenters {
|
for _, vcenter := range config.VCenters {
|
||||||
queryVCenter(*vcenter, config, InfluxDBClient)
|
queryVCenter(*vcenter, config, InfluxDBClient)
|
||||||
|
Loading…
Reference in New Issue
Block a user