mirror of
				https://github.com/Oxalide/vsphere-influxdb-go.git
				synced 2023-10-10 11:36:51 +00:00 
			
		
		
		
	| @@ -36,6 +36,10 @@ $GOBIN/vsphere-influxdb-go | ||||
| # Configure | ||||
|  | ||||
| You'll need a JSON file with all your vCenters/ESXi to connect to, the InfluxDB connection details(url, username/password, database to use), and the metrics to collect. | ||||
| Additionally  you can provide a vCenter/ESXi server and InfluxDB connection details via environment variables, wich is extremly helpful when running inside a container. | ||||
|  | ||||
| For InfluxDB set INFLUX\_HOSTNAME, INFLUX\_USERNAME, INFLUX\_PASSWORD and INFLUX\_DATABASE. | ||||
| For vSphere set VSPHERE\_HOSTNAME, VSPHERE\_USERNAME and VSPHERE\_PASSWORD and keep in mind, that currently only one vCenter/ESXi can be added via environment variable. | ||||
|  | ||||
| If you set a domain, it will be automaticaly removed from the names of the found objects. | ||||
|  | ||||
|   | ||||
| @@ -271,10 +271,10 @@ func (vcenter *VCenter) Query(config Configuration, InfluxDBClient influxclient. | ||||
| 		} else if mor.Type == "ResourcePool" { | ||||
| 			respoolRefs = append(respoolRefs, mor) | ||||
| 		} else if mor.Type == "Datastore" { | ||||
|                         datastoreRefs = append(datastoreRefs, mor) | ||||
|                 } | ||||
| 			datastoreRefs = append(datastoreRefs, mor) | ||||
| 		} | ||||
| 	} | ||||
| 	 | ||||
|  | ||||
| 	// Copy the mors without the clusters | ||||
| 	mors = newMors | ||||
| 	pc := property.DefaultCollector(client.Client) | ||||
| @@ -294,7 +294,7 @@ func (vcenter *VCenter) Query(config Configuration, InfluxDBClient influxclient. | ||||
| 		fmt.Println(err) | ||||
| 		return | ||||
| 	} | ||||
| 	 | ||||
|  | ||||
| 	//Retrieve properties for Cluster(s) | ||||
| 	var clmo []mo.ClusterComputeResource | ||||
| 	err = pc.Retrieve(ctx, clusterRefs, []string{"name", "configuration", "host"}, &clmo) | ||||
| @@ -302,7 +302,7 @@ func (vcenter *VCenter) Query(config Configuration, InfluxDBClient influxclient. | ||||
| 		fmt.Println(err) | ||||
| 		return | ||||
| 	} | ||||
| 	 | ||||
|  | ||||
| 	//Retrieve properties for ResourcePool | ||||
| 	var rpmo []mo.ResourcePool | ||||
| 	err = pc.Retrieve(ctx, respoolRefs, []string{"summary"}, &rpmo) | ||||
| @@ -311,14 +311,14 @@ func (vcenter *VCenter) Query(config Configuration, InfluxDBClient influxclient. | ||||
| 		return | ||||
| 	} | ||||
|  | ||||
|         // Retrieve summary property for all datastores | ||||
|         var dss []mo.Datastore | ||||
|         err = pc.Retrieve(ctx, datastoreRefs, []string{"summary"}, &dss) | ||||
|         if err != nil { | ||||
|                 log.Fatal(err) | ||||
| 	// Retrieve summary property for all datastores | ||||
| 	var dss []mo.Datastore | ||||
| 	err = pc.Retrieve(ctx, datastoreRefs, []string{"summary"}, &dss) | ||||
| 	if err != nil { | ||||
| 		log.Fatal(err) | ||||
| 		return | ||||
|         } | ||||
|          | ||||
| 	} | ||||
|  | ||||
| 	// Initialize the map that will hold the VM MOR to ResourcePool reference | ||||
| 	vmToPool := make(map[types.ManagedObjectReference]string) | ||||
|  | ||||
| @@ -355,37 +355,37 @@ func (vcenter *VCenter) Query(config Configuration, InfluxDBClient influxclient. | ||||
|  | ||||
| 	// Initialize the map that will hold the VM MOR to cluster reference | ||||
| 	hostToCluster := make(map[types.ManagedObjectReference]string) | ||||
| 	 | ||||
|  | ||||
| 	// Retrieve properties for clusters, if any | ||||
| 	if len(clusterRefs) > 0 { | ||||
| 		if debug == true { | ||||
| 			stdlog.Println("going inside clusters") | ||||
| 		} | ||||
|  | ||||
| 	    // Step 1 : Get ObjectContents and Host info for VM | ||||
| 	    //          The host is found under the runtime structure. | ||||
| 	     | ||||
| 	    // Step 2 : Step 2: Get the ManagedObjectReference from the Host we just got. | ||||
| 	     | ||||
| 	    // Step 3 : Get a list all the clusters that vCenter knows about, and for each one, also get the host | ||||
| 	     | ||||
| 	    // Step 4 : Loop through all clusters that exist (which we got in step 3), and loop through each host | ||||
| 	    //          and see if that host matches the host we got in step 2 as the host of the vm. | ||||
| 	    //          If we find it, return it, otherwise we return null. | ||||
| 		// Step 1 : Get ObjectContents and Host info for VM | ||||
| 		//          The host is found under the runtime structure. | ||||
|  | ||||
| 	    for _, vm := range vmmo { | ||||
| 		    vmhost := vm.Summary.Runtime.Host	 | ||||
| 		// Step 2 : Step 2: Get the ManagedObjectReference from the Host we just got. | ||||
|  | ||||
| 		    for _, cl := range clmo { | ||||
| 		    	for _, host := range cl.Host { | ||||
| 		    		hostToCluster[host] = cl.Name | ||||
| 		    		 | ||||
| 		    		if *vmhost == host { | ||||
| 		    			vmToCluster[vm.Self] = cl.Name | ||||
| 		    		} | ||||
| 		    	} | ||||
| 		    } | ||||
| 	    } | ||||
| 		// Step 3 : Get a list all the clusters that vCenter knows about, and for each one, also get the host | ||||
|  | ||||
| 		// Step 4 : Loop through all clusters that exist (which we got in step 3), and loop through each host | ||||
| 		//          and see if that host matches the host we got in step 2 as the host of the vm. | ||||
| 		//          If we find it, return it, otherwise we return null. | ||||
|  | ||||
| 		for _, vm := range vmmo { | ||||
| 			vmhost := vm.Summary.Runtime.Host | ||||
|  | ||||
| 			for _, cl := range clmo { | ||||
| 				for _, host := range cl.Host { | ||||
| 					hostToCluster[host] = cl.Name | ||||
|  | ||||
| 					if *vmhost == host { | ||||
| 						vmToCluster[vm.Self] = cl.Name | ||||
| 					} | ||||
| 				} | ||||
| 			} | ||||
| 		} | ||||
|  | ||||
| 	} | ||||
|  | ||||
| @@ -653,18 +653,18 @@ func (vcenter *VCenter) Query(config Configuration, InfluxDBClient influxclient. | ||||
| 		} | ||||
|  | ||||
| 		for _, datastore := range dss { | ||||
|                         datastoreFields := map[string]interface{}{ | ||||
|                                 "capacity":    datastore.Summary.Capacity, | ||||
|                                 "free_space": datastore.Summary.FreeSpace, | ||||
|                         } | ||||
|                         datastoreTags := map[string]string{"ds_name": datastore.Summary.Name} | ||||
|                         pt4, err := influxclient.NewPoint("datastore", datastoreTags, datastoreFields, time.Now()) | ||||
|                         if err != nil { | ||||
|                                 errlog.Println(err) | ||||
|                                 continue | ||||
|                         } | ||||
|                         bp.AddPoint(pt4) | ||||
|                 } | ||||
| 			datastoreFields := map[string]interface{}{ | ||||
| 				"capacity":   datastore.Summary.Capacity, | ||||
| 				"free_space": datastore.Summary.FreeSpace, | ||||
| 			} | ||||
| 			datastoreTags := map[string]string{"ds_name": datastore.Summary.Name} | ||||
| 			pt4, err := influxclient.NewPoint("datastore", datastoreTags, datastoreFields, time.Now()) | ||||
| 			if err != nil { | ||||
| 				errlog.Println(err) | ||||
| 				continue | ||||
| 			} | ||||
| 			bp.AddPoint(pt4) | ||||
| 		} | ||||
|  | ||||
| 	} | ||||
|  | ||||
| @@ -763,6 +763,31 @@ func main() { | ||||
| 		errlog.Fatalln(err) | ||||
| 	} | ||||
|  | ||||
| 	// Support environemt variables / overrides for Influx Connection | ||||
| 	if ihostname := os.Getenv("INFLUX_HOSTNAME"); ihostname != "" { | ||||
| 		config.InfluxDB.Hostname = os.Getenv("INFLUX_HOSTNAME") | ||||
| 		config.InfluxDB.Username = os.Getenv("INFLUX_USERNAME") | ||||
| 		config.InfluxDB.Password = os.Getenv("INFLUX_PASSWORD") | ||||
| 		config.InfluxDB.Database = os.Getenv("INFLUX_DATABASE") | ||||
| 	} | ||||
|  | ||||
| 	// Support environment variables for VSphere | ||||
| 	// Currently ony one server is supported and added to the list of vSphere servers | ||||
| 	if vhostname := os.Getenv("VSPHERE_HOSTNAME"); vhostname != "" { | ||||
| 		vc := VCenter{ | ||||
| 			Hostname: os.Getenv("VSPHERE_HOSTNAME"), | ||||
| 			Username: os.Getenv("VSPHERE_USERNAME"), | ||||
| 			Password: os.Getenv("VSPHERE_PASSWORD"), | ||||
| 		} | ||||
| 		config.VCenters = append(config.VCenters, &vc) | ||||
| 	} | ||||
|  | ||||
| 	// Print configuration in debug mode | ||||
| 	if debug == true { | ||||
| 		stdlog.Println("---Configuration - you should see the config here---") | ||||
| 		spew.Dump(config) | ||||
| 	} | ||||
|  | ||||
| 	for _, vcenter := range config.VCenters { | ||||
| 		vcenter.Init(config) | ||||
| 	} | ||||
|   | ||||
		Reference in New Issue
	
	Block a user