SDKs and Recipes
Go SDK
5min
1\ use amberflo api key package main import ( 	"encoding/json" 	"fmt" 	"os" 	"time" 	"github com/amberflo/metering go/v2" 	"github com/rs/zerolog" 	"github com/xtgo/uuid" ) func main() { 	//obtain your amberflo api key 	apikey = "my api key" 2\ setup the metering client package main import ( 	"encoding/json" 	"fmt" 	"os" 	"time" 	"github com/amberflo/metering go/v2" 	"github com/rs/zerolog" 	"github com/xtgo/uuid" ) func main() { 	//obtain your amberflo api key 	apikey = "my api key" 	//optional ingest options 	//frequency at which queued data will be sent to api default is 1 second 	intervalseconds = 30 time second 	//number of messages posted to the api default is 100 	batchsize = 5 	//debug mode logging default is false 	debug = true 	//instantiate a new metering client 	meteringclient = metering newmeteringclient( 	 apikey, 	 metering withbatchsize(batchsize), 	 metering withintervalseconds(intervalseconds), 	 metering withdebug(debug), 	) 3\ ingest meters package main import ( 	"encoding/json" 	"fmt" 	"os" 	"time" 	"github com/amberflo/metering go/v2" 	"github com/rs/zerolog" 	"github com/xtgo/uuid" ) func main() { 	//obtain your amberflo api key 	apikey = "my api key" 	//optional ingest options 	//frequency at which queued data will be sent to api default is 1 second 	intervalseconds = 30 time second 	//number of messages posted to the api default is 100 	batchsize = 5 	//debug mode logging default is false 	debug = true 	//instantiate a new metering client 	meteringclient = metering newmeteringclient( 	 apikey, 	 metering withbatchsize(batchsize), 	 metering withintervalseconds(intervalseconds), 	 metering withdebug(debug), 	) 	//define dimesions for your meters dimensions can be used as filters 	dimensions = make(map\[string]string) 	dimensions\["region"] = "midwest" 	dimensions\["customertype"] = "tech" 	for i = 0; i < 50; i++ { 	 utcmillis = time now() unixnano() / int64(time millisecond) 	 //queue meter messages for ingestion 	 //queue will be flushed asyncrhonously when metering batchsize is exceeded 	 //or periodically at metering intervalseconds 	 //unique id is optional, but setting it 	 //helps with de dupe and revoking an ingested meter 	 uniqueid = uuid newrandom() string() 	 meteringerror = meteringclient meter(\&metering metermessage{ 	 uniqueid uniqueid, 	 meterapiname "apicalls from go", 	 customerid "1234", 	 metervalue float64(i) + 234 0, 	 metertimeinmillis utcmillis, 	 dimensions dimensions, 	 }) 	 if meteringerror != nil { 	 fmt println("metering error ", meteringerror) 	 } 	 time sleep(500 time millisecond) 	} 4\ shutdown metering client package main import ( 	"encoding/json" 	"fmt" 	"os" 	"time" 	"github com/amberflo/metering go/v2" 	"github com/rs/zerolog" 	"github com/xtgo/uuid" ) func main() { 	//obtain your amberflo api key 	apikey = "my api key" 	//optional ingest options 	//frequency at which queued data will be sent to api default is 1 second 	intervalseconds = 30 time second 	//number of messages posted to the api default is 100 	batchsize = 5 	//debug mode logging default is false 	debug = true 	//instantiate a new metering client 	meteringclient = metering newmeteringclient( 	 apikey, 	 metering withbatchsize(batchsize), 	 metering withintervalseconds(intervalseconds), 	 metering withdebug(debug), 	) 	//define dimesions for your meters dimensions can be used as filters 	dimensions = make(map\[string]string) 	dimensions\["region"] = "midwest" 	dimensions\["customertype"] = "tech" 	for i = 0; i < 50; i++ { 	 utcmillis = time now() unixnano() / int64(time millisecond) 	 //queue meter messages for ingestion 	 //queue will be flushed asyncrhonously when metering batchsize is exceeded 	 //or periodically at metering intervalseconds 	 //unique id is optional, but setting it 	 //helps with de dupe and revoking an ingested meter 	 uniqueid = uuid newrandom() string() 	 meteringerror = meteringclient meter(\&metering metermessage{ 	 uniqueid uniqueid, 	 meterapiname "apicalls from go", 	 customerid "1234", 	 metervalue float64(i) + 234 0, 	 metertimeinmillis utcmillis, 	 dimensions dimensions, 	 }) 	 if meteringerror != nil { 	 fmt println("metering error ", meteringerror) 	 } 	 time sleep(500 time millisecond) 	} 	//perform graceful shutdown 	//flush all messages in the queue, stop the timer, close all channels, and shutdown the client 	meteringclient shutdown() } 5\ query usage func usage() { 	//obtain your amberflo api key 	apikey = "my api key" 	//initialize the usage client 	usageclient = metering newusageclient(apikey) //set the start time of the time range in epoch seconds starttimeinseconds = (time now() unixnano() / int64(time second)) (24 60 60) 	timerange = \&metering timerange{ 	 starttimeinseconds starttimeinseconds, 	} //specify the limit and sort order 	take = \&metering take{ 	 limit 10, 	 isascending true, 	} 	// example 1 group by customers for a specific meter and all customers 	// setup usage query params 	// visit following link for description of payload 	// https //amberflo readme io/reference#usage 	usageresult, err = usageclient getusage(\&metering usagepayload{ 	 meterapiname "apicalls from go", 	 aggregation metering sum, 	 timegroupinginterval metering day, 	 groupby \[]string{"customerid"}, 	 timerange timerange, 	}) 	fmt println("usage by meterapiname in json format") 	printusagedata( usageresult, err) 	//example 2 filter for a meter for specific customer 	//setup usage query params 	filter = make(map\[string]string) 	filter\["customerid"] = "1234" 	usageresult, err = usageclient getusage(\&metering usagepayload{ 	 meterapiname "apicalls from go", 	 aggregation metering sum, 	 timegroupinginterval metering day, 	 groupby \[]string{"customerid"}, 	 timerange timerange, 	 filter filter, 	}) 	fmt println("usage for meter for specific customer in json format") 	printusagedata( usageresult, err) } func printusagedata(usageresult metering detailedmeteraggregation, err error) { 	if err != nil { 	 fmt println("usage error ", err) 	 return 	} 	jsonstring, err = json marshalindent(usageresult, "", " ") 	if err != nil { 	 fmt println("usage error ", err) 	 return 	} 	fmt println(string(jsonstring)) } 6\ create customer func setupcustomer() { 	//obtain your amberflo api key 	apikey = "my api key" 	customerid = "dell 8" 	//automatically create customer in stripe 	//and add stripeid to traits 	createcustomerinstripe = true 	//instantiate a new metering client 	customerclient = metering newcustomerclient(apikey) 	//check if customer exists 	customer, err = customerclient getcustomer(customerid) 	if err != nil { 	 fmt println("error getting customer details ", err) 	} 	//setup customer 	//traits are optional traits can be used as filters or aggregation buckets 	if customer != nil { 	 //customer exists 	 //update properties 	 customer customername = "dell 2" 	} else { 	 //setup new customer 	 //traits are optional traits can be used as filters or aggregation buckets 	 traits = make(map\[string]string) 	 traits\["region"] = "us west" 	 traits\["customertype"] = "tech" 	 customer = \&metering customer{ 	 customerid customerid, 	 customername "dell", 	 customeremail "test\@dell com", 	 traits traits, 	 enabled true, 	 } 	} 	customer, err = customerclient addorupdatecustomer(customer, createcustomerinstripe) 	if err != nil { 	 fmt println("error creating customer details ", err) 	} customerstatus = fmt sprintf("stripe id for customer %s", customer traits\[metering stripetraitkey]) 	fmt println(customerstatus) } 7\ define custom logger type customlogger struct { 	logger zerolog logger } func newcustomlogger() customlogger { 	loglevel = zerolog debuglevel 	zerolog setgloballevel(loglevel) 	logger = zerolog new(os stdout) with() timestamp() logger() 	return \&customlogger{logger \&logger} } func (l customlogger) log(args interface{}) { 	msg = fmt sprintln(args ) 	l logger debug() msg(msg) } func (l customlogger) logf(format string, args interface{}) { 	l logger debug() msgf(format, args ) } 8\ inject custom logger func createclientwithcustomerlogger() { 	//obtain your amberflo api key 	apikey = "my api key" 	customerlogger = newcustomlogger() 	//instantiate a new metering client with custom logger 	metering = metering newmeteringclient( 	 apikey, 	 metering withlogger(customerlogger), 	) } 9\ query usage cost func queryusagecost(){ //obtain your amberflo api key 	apikey = "my api key" 	customerid = "dell 8" 	//initialize the usage cost client 	usagecostclient = metering newusagecostclient(apikey) //set the start time of the time range in epoch seconds starttimeinseconds = (time now() unixnano() / int64(time second)) (24 60 60) 	timerange = \&metering timerange{ 	 starttimeinseconds starttimeinseconds, 	} //specify the limit and sort order 	takeforcost = \&metering take{ 	 limit 10, 	 isascending false, 	} 	// example 1 group by customers 	// setup usage cost query params 	// visit following link for description of payload 	// https //docs amberflo io/reference/post payments cost usage cost 	usagecostresult, err = usagecostclient getusagecost(\&metering usagecostskey{ 	 timegroupinginterval metering day, 	 groupby \[]string{"product plan id"}, 	 timerange timerange, 	 take takeforcost, 	}) 	fmt println("usage cost result") 	printusagecostdata( usagecostresult, err) 	//example 2 filter for a cost for specific customer 	//setup usage query params 	filterforcost = make(map\[string]\[]string) 	filterforcost\["customerid"] = \[]string{customerid} 	usagecostresult, err = usagecostclient getusagecost(\&metering usagecostskey{ 	 timegroupinginterval metering day, 	 groupby \[]string{"product plan id"}, 	 timerange timerange, 	 take takeforcost, 	 filters filterforcost, 	}) 	fmt println("usage cost for specific customer") 	printusagecostdata( usagecostresult, err) } func printusagecostdata(usagecostresult metering usagecosts, err error) { 	if err != nil { 	 fmt println("usage cost error ", err) 	 return 	} 	jsonstring, err = json marshalindent(usagecostresult, "", " ") 	if err != nil { 	 fmt println("usage cost error ", err) 	 return 	} 	fmt println(string(jsonstring)) }