mirror of
https://github.com/Oxalide/vsphere-influxdb-go.git
synced 2023-10-10 11:36:51 +00:00
Compare commits
No commits in common. "master" and "v0.8.4" have entirely different histories.
@ -17,6 +17,6 @@ before_script:
|
|||||||
script:
|
script:
|
||||||
- git status
|
- git status
|
||||||
after_success:
|
after_success:
|
||||||
# - gem install --no-ri --no-rdoc fpm
|
- gem install --no-ri --no-rdoc fpm
|
||||||
- test -n "$TRAVIS_TAG" && curl -sL https://git.io/goreleaser | bash
|
- test -n "$TRAVIS_TAG" && curl -sL https://git.io/goreleaser | bash
|
||||||
|
|
||||||
|
18
Dockerfile
18
Dockerfile
@ -1,18 +0,0 @@
|
|||||||
FROM golang:1.12-alpine3.10 as builder
|
|
||||||
|
|
||||||
WORKDIR /go/src/vsphere-influxdb-go
|
|
||||||
COPY . .
|
|
||||||
RUN apk --update add --virtual build-deps git
|
|
||||||
RUN go get -d -v ./...
|
|
||||||
RUN CGO_ENABLED=0 GOOS=linux go build -a -installsuffix cgo
|
|
||||||
|
|
||||||
FROM alpine:3.10
|
|
||||||
RUN apk update \
|
|
||||||
&& apk upgrade \
|
|
||||||
&& apk add ca-certificates \
|
|
||||||
&& addgroup -S spock && adduser -S spock -G spock
|
|
||||||
COPY --from=0 /go/src/vsphere-influxdb-go/vsphere-influxdb-go /vsphere-influxdb-go
|
|
||||||
|
|
||||||
USER spock
|
|
||||||
|
|
||||||
CMD ["/vsphere-influxdb-go"]
|
|
39
Gopkg.lock
generated
39
Gopkg.lock
generated
@ -2,65 +2,32 @@
|
|||||||
|
|
||||||
|
|
||||||
[[projects]]
|
[[projects]]
|
||||||
digest = "1:56c130d885a4aacae1dd9c7b71cfe39912c7ebc1ff7d2b46083c8812996dc43b"
|
|
||||||
name = "github.com/davecgh/go-spew"
|
name = "github.com/davecgh/go-spew"
|
||||||
packages = ["spew"]
|
packages = ["spew"]
|
||||||
pruneopts = ""
|
|
||||||
revision = "346938d642f2ec3594ed81d874461961cd0faa76"
|
revision = "346938d642f2ec3594ed81d874461961cd0faa76"
|
||||||
version = "v1.1.0"
|
version = "v1.1.0"
|
||||||
|
|
||||||
[[projects]]
|
[[projects]]
|
||||||
digest = "1:ec837623c12abf4f44837163ad32274dd0c9dfa29f0d65068c60897bce34bb75"
|
|
||||||
name = "github.com/influxdata/influxdb"
|
name = "github.com/influxdata/influxdb"
|
||||||
packages = [
|
packages = ["client/v2","models","pkg/escape"]
|
||||||
"client/v2",
|
|
||||||
"models",
|
|
||||||
"pkg/escape",
|
|
||||||
]
|
|
||||||
pruneopts = ""
|
|
||||||
revision = "a7c3d3c0f7b74f71919047adbc4933460967a576"
|
revision = "a7c3d3c0f7b74f71919047adbc4933460967a576"
|
||||||
version = "v1.3.6"
|
version = "v1.3.6"
|
||||||
|
|
||||||
[[projects]]
|
[[projects]]
|
||||||
digest = "1:c5342f3ddefc1644d1a3ed028e739bfabe5b457978084b9a28d42ed235c8bb4d"
|
|
||||||
name = "github.com/vmware/govmomi"
|
name = "github.com/vmware/govmomi"
|
||||||
packages = [
|
packages = [".","property","session","vim25","vim25/debug","vim25/methods","vim25/mo","vim25/progress","vim25/soap","vim25/types","vim25/xml"]
|
||||||
".",
|
|
||||||
"property",
|
|
||||||
"session",
|
|
||||||
"vim25",
|
|
||||||
"vim25/debug",
|
|
||||||
"vim25/methods",
|
|
||||||
"vim25/mo",
|
|
||||||
"vim25/progress",
|
|
||||||
"vim25/soap",
|
|
||||||
"vim25/types",
|
|
||||||
"vim25/xml",
|
|
||||||
]
|
|
||||||
pruneopts = ""
|
|
||||||
revision = "b63044e5f833781eb7b305bc035392480ee06a82"
|
revision = "b63044e5f833781eb7b305bc035392480ee06a82"
|
||||||
version = "v0.15.0"
|
version = "v0.15.0"
|
||||||
|
|
||||||
[[projects]]
|
[[projects]]
|
||||||
branch = "master"
|
branch = "master"
|
||||||
digest = "1:70ca15641aa31be55859a7f75ddef3ae384ae18068deab8274668a1a77d1e84a"
|
|
||||||
name = "golang.org/x/net"
|
name = "golang.org/x/net"
|
||||||
packages = ["context"]
|
packages = ["context"]
|
||||||
pruneopts = ""
|
|
||||||
revision = "4b14673ba32bee7f5ac0f990a48f033919fd418b"
|
revision = "4b14673ba32bee7f5ac0f990a48f033919fd418b"
|
||||||
|
|
||||||
[solve-meta]
|
[solve-meta]
|
||||||
analyzer-name = "dep"
|
analyzer-name = "dep"
|
||||||
analyzer-version = 1
|
analyzer-version = 1
|
||||||
input-imports = [
|
inputs-digest = "0b7718e6a338978c4ea1efca3255565c667967ddd6ff68999a1d1cea5112209e"
|
||||||
"github.com/davecgh/go-spew/spew",
|
|
||||||
"github.com/influxdata/influxdb/client/v2",
|
|
||||||
"github.com/vmware/govmomi",
|
|
||||||
"github.com/vmware/govmomi/property",
|
|
||||||
"github.com/vmware/govmomi/vim25/methods",
|
|
||||||
"github.com/vmware/govmomi/vim25/mo",
|
|
||||||
"github.com/vmware/govmomi/vim25/types",
|
|
||||||
"golang.org/x/net/context",
|
|
||||||
]
|
|
||||||
solver-name = "gps-cdcl"
|
solver-name = "gps-cdcl"
|
||||||
solver-version = 1
|
solver-version = 1
|
||||||
|
@ -49,7 +49,7 @@ For InfluxDB:
|
|||||||
For vSphere:
|
For vSphere:
|
||||||
* VSPHERE\_HOSTNAME
|
* VSPHERE\_HOSTNAME
|
||||||
* VSPHERE\_USERNAME
|
* VSPHERE\_USERNAME
|
||||||
* VSPHERE\_PASSWORD
|
* SPHERE\_PASSWORD
|
||||||
|
|
||||||
Keep in mind, that currently only one vCenter/ESXi can be added via environment variable.
|
Keep in mind, that currently only one vCenter/ESXi can be added via environment variable.
|
||||||
|
|
||||||
@ -57,7 +57,6 @@ If you set a domain, it will be automaticaly removed from the names of the found
|
|||||||
|
|
||||||
Metrics collected are defined by associating ObjectType groups with Metric groups.
|
Metrics collected are defined by associating ObjectType groups with Metric groups.
|
||||||
|
|
||||||
There have been reports of the script not working correctly when the time is incorrect on the vsphere or vcenter. Make sure that the time is valid or activate the NTP service on the machine.
|
|
||||||
|
|
||||||
# Run as a service
|
# Run as a service
|
||||||
|
|
||||||
|
@ -19,7 +19,7 @@ archive:
|
|||||||
files:
|
files:
|
||||||
- LICENSE.txt
|
- LICENSE.txt
|
||||||
- README.md
|
- README.md
|
||||||
nfpm:
|
fpm:
|
||||||
# Your app's vendor.
|
# Your app's vendor.
|
||||||
# Default is empty.
|
# Default is empty.
|
||||||
vendor: Oxalide
|
vendor: Oxalide
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
/* Copyright 2016-2018 Adrian Todorov, Oxalide ato@oxalide.com
|
/* Copyright 2016 Adrian Todorov, Oxalide ato@oxalide.com
|
||||||
Original project author: https://github.com/cblomart
|
Original project author: https://github.com/cblomart
|
||||||
This program is free software: you can redistribute it and/or modify
|
This program is free software: you can redistribute it and/or modify
|
||||||
it under the terms of the GNU General Public License as published by
|
it under the terms of the GNU General Public License as published by
|
||||||
@ -51,7 +51,6 @@ type Configuration struct {
|
|||||||
Metrics []Metric
|
Metrics []Metric
|
||||||
Interval int
|
Interval int
|
||||||
Domain string
|
Domain string
|
||||||
RemoveHostDomainName bool
|
|
||||||
InfluxDB InfluxDB
|
InfluxDB InfluxDB
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -104,14 +103,14 @@ var getversion, debug, test bool
|
|||||||
var stdlog, errlog *log.Logger
|
var stdlog, errlog *log.Logger
|
||||||
var version = "master"
|
var version = "master"
|
||||||
|
|
||||||
|
|
||||||
// Connect to the actual vCenter connection used to query data
|
// Connect to the actual vCenter connection used to query data
|
||||||
func (vcenter *VCenter) Connect() error {
|
func (vcenter *VCenter) Connect() error {
|
||||||
ctx, cancel := context.WithCancel(context.Background())
|
ctx, cancel := context.WithCancel(context.Background())
|
||||||
defer cancel()
|
defer cancel()
|
||||||
|
|
||||||
stdlog.Println("Connecting to vcenter:", vcenter.Hostname)
|
stdlog.Println("Connecting to vcenter:", vcenter.Hostname)
|
||||||
u, err := url.Parse("https://" + vcenter.Hostname + "/sdk")
|
u, err := url.Parse("https://" + vcenter.Username + ":" + vcenter.Password + "@" + vcenter.Hostname + "/sdk")
|
||||||
u.User = url.UserPassword(vcenter.Username, vcenter.Password)
|
|
||||||
if err != nil {
|
if err != nil {
|
||||||
errlog.Println("Could not parse vcenter url:", vcenter.Hostname)
|
errlog.Println("Could not parse vcenter url:", vcenter.Hostname)
|
||||||
errlog.Println("Error:", err)
|
errlog.Println("Error:", err)
|
||||||
@ -152,12 +151,6 @@ func (vcenter *VCenter) Init(config Configuration) error {
|
|||||||
|
|
||||||
client := vcenter.client
|
client := vcenter.client
|
||||||
|
|
||||||
// Print version
|
|
||||||
if debug {
|
|
||||||
aboutInfo := client.Client.ServiceContent.About
|
|
||||||
stdlog.Println("Version:", aboutInfo.FullName)
|
|
||||||
}
|
|
||||||
|
|
||||||
var perfmanager mo.PerformanceManager
|
var perfmanager mo.PerformanceManager
|
||||||
err := client.RetrieveOne(ctx, *client.ServiceContent.PerfManager, nil, &perfmanager)
|
err := client.RetrieveOne(ctx, *client.ServiceContent.PerfManager, nil, &perfmanager)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
@ -166,12 +159,6 @@ func (vcenter *VCenter) Init(config Configuration) error {
|
|||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
// Print PerformanceManager interval collection level
|
|
||||||
if debug {
|
|
||||||
stdlog.Println("PerformanceManager interval collection level")
|
|
||||||
spew.Dump(perfmanager.HistoricalInterval)
|
|
||||||
}
|
|
||||||
|
|
||||||
for _, perf := range perfmanager.PerfCounter {
|
for _, perf := range perfmanager.PerfCounter {
|
||||||
groupinfo := perf.GroupInfo.GetElementDescription()
|
groupinfo := perf.GroupInfo.GetElementDescription()
|
||||||
nameinfo := perf.NameInfo.GetElementDescription()
|
nameinfo := perf.NameInfo.GetElementDescription()
|
||||||
@ -390,9 +377,6 @@ func (vcenter *VCenter) Query(config Configuration, InfluxDBClient influxclient.
|
|||||||
// Initialize the map that will hold the host MOR to cluster reference
|
// Initialize the map that will hold the host MOR to cluster reference
|
||||||
hostToCluster := make(map[types.ManagedObjectReference]string)
|
hostToCluster := make(map[types.ManagedObjectReference]string)
|
||||||
|
|
||||||
// Initialize the map that will hold the vDisk UUID per VM MOR to datastore reference
|
|
||||||
// vDiskToDatastore := make(map[types.ManagedObjectReference]map[string]string)
|
|
||||||
|
|
||||||
// Retrieve properties for clusters, if any
|
// Retrieve properties for clusters, if any
|
||||||
if len(clusterRefs) > 0 {
|
if len(clusterRefs) > 0 {
|
||||||
if debug {
|
if debug {
|
||||||
@ -446,10 +430,6 @@ func (vcenter *VCenter) Query(config Configuration, InfluxDBClient influxclient.
|
|||||||
// Extra tags per host
|
// Extra tags per host
|
||||||
hostSummary[host.Self] = make(map[string]string)
|
hostSummary[host.Self] = make(map[string]string)
|
||||||
hostSummary[host.Self]["name"] = host.Summary.Config.Name
|
hostSummary[host.Self]["name"] = host.Summary.Config.Name
|
||||||
// Remove Domain Name from Host
|
|
||||||
if config.RemoveHostDomainName {
|
|
||||||
hostSummary[host.Self]["name"] = strings.Replace(host.Summary.Config.Name, config.Domain, "", -1)
|
|
||||||
}
|
|
||||||
hostSummary[host.Self]["cluster"] = hostToCluster[host.Self]
|
hostSummary[host.Self]["cluster"] = hostToCluster[host.Self]
|
||||||
|
|
||||||
// Extra metrics per host
|
// Extra metrics per host
|
||||||
@ -472,18 +452,6 @@ func (vcenter *VCenter) Query(config Configuration, InfluxDBClient influxclient.
|
|||||||
fmt.Println(err)
|
fmt.Println(err)
|
||||||
}
|
}
|
||||||
vmSummary[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)
|
||||||
|
|
||||||
// List all devices to get vDisks
|
|
||||||
// for _, device := range vm.Config.Hardware.Device {
|
|
||||||
// // Hacky way to check if it's a vDisk and if it's datastore is different than the main one for VM
|
|
||||||
// if device.Backing.FileName != nil && device.Backing.Datastore.Name != vmSummary[vm.Self]["datastore"] {
|
|
||||||
// if vDiskToDatastore[vm.Self] == nil {
|
|
||||||
// vDiskToDatastore[vm.Self] = make(map[string]string)
|
|
||||||
// }
|
|
||||||
// vDiskToDatastore[vm.Self][device.diskObjectId] = device.Backing.Datastore.Name
|
|
||||||
// }
|
|
||||||
// }
|
|
||||||
|
|
||||||
if vmToCluster[vm.Self] != "" {
|
if vmToCluster[vm.Self] != "" {
|
||||||
vmSummary[vm.Self]["cluster"] = vmToCluster[vm.Self]
|
vmSummary[vm.Self]["cluster"] = vmToCluster[vm.Self]
|
||||||
}
|
}
|
||||||
@ -498,8 +466,7 @@ func (vcenter *VCenter) Query(config Configuration, InfluxDBClient influxclient.
|
|||||||
vmExtraMetrics[vm.Self] = make(map[string]int64)
|
vmExtraMetrics[vm.Self] = make(map[string]int64)
|
||||||
vmExtraMetrics[vm.Self]["uptime"] = int64(vm.Summary.QuickStats.UptimeSeconds)
|
vmExtraMetrics[vm.Self]["uptime"] = int64(vm.Summary.QuickStats.UptimeSeconds)
|
||||||
}
|
}
|
||||||
// fmt.Println("vDiskDatastore:")
|
|
||||||
// spew.Dump(vDiskToDatastore)
|
|
||||||
// get object names
|
// get object names
|
||||||
objects := []mo.ManagedEntity{}
|
objects := []mo.ManagedEntity{}
|
||||||
|
|
||||||
@ -707,6 +674,13 @@ func (vcenter *VCenter) Query(config Configuration, InfluxDBClient influxclient.
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// var respool []mo.ResourcePool
|
||||||
|
// err = pc.Retrieve(ctx, respoolRefs, []string{"name", "config", "vm"}, &respool)
|
||||||
|
// if err != nil {
|
||||||
|
// errlog.Println(err)
|
||||||
|
// continue
|
||||||
|
// }
|
||||||
|
|
||||||
for _, pool := range respool {
|
for _, pool := range respool {
|
||||||
respoolFields := map[string]interface{}{
|
respoolFields := map[string]interface{}{
|
||||||
"cpu_limit": pool.Config.CpuAllocation.GetResourceAllocationInfo().Limit,
|
"cpu_limit": pool.Config.CpuAllocation.GetResourceAllocationInfo().Limit,
|
||||||
@ -725,7 +699,6 @@ func (vcenter *VCenter) Query(config Configuration, InfluxDBClient influxclient.
|
|||||||
datastoreFields := map[string]interface{}{
|
datastoreFields := map[string]interface{}{
|
||||||
"capacity": datastore.Summary.Capacity,
|
"capacity": datastore.Summary.Capacity,
|
||||||
"free_space": datastore.Summary.FreeSpace,
|
"free_space": datastore.Summary.FreeSpace,
|
||||||
"usage": 1.0 - (float64(datastore.Summary.FreeSpace) / float64(datastore.Summary.Capacity)),
|
|
||||||
}
|
}
|
||||||
datastoreTags := map[string]string{"ds_name": datastore.Summary.Name, "host": vcName}
|
datastoreTags := map[string]string{"ds_name": datastore.Summary.Name, "host": vcName}
|
||||||
pt4, err := influxclient.NewPoint(config.InfluxDB.Prefix+"datastore", datastoreTags, datastoreFields, time.Now())
|
pt4, err := influxclient.NewPoint(config.InfluxDB.Prefix+"datastore", datastoreTags, datastoreFields, time.Now())
|
||||||
@ -766,6 +739,7 @@ func min(n ...int64) int64 {
|
|||||||
}
|
}
|
||||||
return min
|
return min
|
||||||
}
|
}
|
||||||
|
|
||||||
func max(n ...int64) int64 {
|
func max(n ...int64) int64 {
|
||||||
var max int64 = -1
|
var max int64 = -1
|
||||||
for _, i := range n {
|
for _, i := range n {
|
||||||
@ -816,6 +790,7 @@ func worker(id int, config Configuration, influxDBClient influxclient.Client, no
|
|||||||
results <- true
|
results <- true
|
||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
|
|
||||||
if err := vcenter.Init(config); err == nil {
|
if err := vcenter.Init(config); err == nil {
|
||||||
vcenter.Query(config, influxDBClient, nowTime)
|
vcenter.Query(config, influxDBClient, nowTime)
|
||||||
}
|
}
|
||||||
@ -838,7 +813,7 @@ func main() {
|
|||||||
flag.Parse()
|
flag.Parse()
|
||||||
|
|
||||||
if getversion {
|
if getversion {
|
||||||
fmt.Println("Version:", version)
|
stdlog.Println("Version:",version)
|
||||||
os.Exit(0)
|
os.Exit(0)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1,6 +1,5 @@
|
|||||||
{
|
{
|
||||||
"Domain": ".lab",
|
"Domain": ".lab",
|
||||||
"RemoveHostDomainName": false,
|
|
||||||
"Interval": 60,
|
"Interval": 60,
|
||||||
"VCenters": [
|
"VCenters": [
|
||||||
{ "Username": "monitoring", "Password": "monixx", "Hostname": "vcenter-01.dc-01.lab" },
|
{ "Username": "monitoring", "Password": "monixx", "Hostname": "vcenter-01.dc-01.lab" },
|
||||||
|
Loading…
x
Reference in New Issue
Block a user