Usage Metering
Ingestion Options
SDK Sample Code
8 min
this sample demonstrates how to ingest meter events using the amberflo sdk in a spring boot application steps set up the amberflo environment prepare your application environment with the required amberflo client settings (e g , api keys, region, etc ) configure service discovery set up your application to discover and communicate with amberflo’s ingestion service create a helper method implement a helper function to map your internal objects to the amberflo ingestion payload format maven dependencies (check for latest versions) \<dependencies> \<dependency> \<groupid>io amberflo\</groupid> \<artifactid>metering java client\</artifactid> \<version>1 3 6\</version> \</dependency> \<dependency> 	 \<groupid>org projectlombok\</groupid> 	 \<artifactid>lombok\</artifactid> 	 \<version>1 18 20\</version> 	\</dependency> \</dependencies> environment setup details configure the necessary environment variables for the amberflo sdk client add the required configuration entries to your application properties or environment ensure the service is discoverable by the amberflo client at runtime application properties amberflo apikey=your api key here amberflo region=us west amberflo domain=prod amberflo ingestion frequency seconds=1 amberflo ingestion batch size=10 amberflo isdebug=true import com amberflo metering ingest meter message domain; import lombok getter; import org springframework beans factory annotation value; import org springframework stereotype component; import com amberflo metering ingest meter message region; @getter @component public class amberfloenvironment { @value("${amberflo apikey}") private string apikey; @value("${amberflo region}") private region region; @value("${amberflo domain}") private domain domain; @value("${amberflo ingestion frequency seconds}") private double ingestionfrequencyinseconds; @value("${amberflo ingestion batch size}") private integer ingestionbatchsize; } setup amberflo client bean for service discoverability amberflo provides a singleton instance of the client to ensure efficient ingestion of meter events to enable dependency injection and make the client discoverable as a service within your spring boot application create a configuration class define a method that returns the amberflo client as a spring bean this allows other components in your application to inject the amberflo client where needed, promoting reusability and centralized configuration import com amberflo metering ingest meteringcontext; import org apache logging log4j logmanager; import org apache logging log4j logger; import org springframework beans factory annotation autowired; import org springframework context annotation bean; import org springframework context annotation configuration; @configuration public class amberfloclientconfig { @autowired private amberfloenvironment amberfloenvironment; @bean public meteringcontext meteringcontext() { meteringcontext meteringcontext = null; try{ meteringcontext = meteringcontext createorreplacecontext( this amberfloenvironment getapikey(), //todo enter your service name here //the service name will be added for all of your meters as an extra dimension "service name", this amberfloenvironment getdomain(), this amberfloenvironment getregion(), this amberfloenvironment getingestionfrequencyinseconds(), this amberfloenvironment getingestionbatchsize()); if(meteringcontext meteringinstance() != null) { logger info("amberflo client initialized with region={}, domain={}, frequency={}, batchsize={}", this amberfloenvironment getregion(), this amberfloenvironment getdomain(), this amberfloenvironment getingestionfrequencyinseconds(), this amberfloenvironment getingestionbatchsize()); } } catch(exception ex){ logger error("amberflo client initialization failed {}", ex getmessage()); ex printstacktrace(); } return meteringcontext; } } entity to amberflo payload mapper in this approach, your internal entity is transformed into an amberflo ingestion payload using a dedicated helper class for example you have an entity class named event this entity is mapped to the required sdk format in a helper class called amberflomapper the transformation logic is encapsulated in a method like amberflomapper ingestmeterforevent() this method can now be called from anywhere in your code , allowing you to easily meter events across your application in a centralized and reusable way sample entity class import java io serializable; import javax persistence ; import lombok allargsconstructor; import lombok getter; import lombok noargsconstructor; import lombok setter; @getter @setter @noargsconstructor @allargsconstructor @entity @table(name = "event") public class event implements serializable { private static final long serialversionuid = 1l; @id @generatedvalue(strategy=generationtype identity) private long id; @column(name = "event source type") private string eventsourcetype; @column(name = "event type") private string eventtype; @column(name = "customer id") private string customerid; } sample mapper helper import org apache logging log4j logmanager; import org apache logging log4j logger; import java time localdatetime; import java time zoneoffset; import java util hashmap; import java util map; import static com amberflo metering ingest meteringcontext metering; public class amberflomapper { private static final logger logger = logmanager getlogger(); public static void ingestmeterforevent(final event event, final string metername){ try { final string customerid = event getcustomerid(); final double metervalue = 1 0; final localdatetime eventtime = localdatetime now(zoneoffset utc); final map\<string, string> dimensions = new hashmap(); dimensions put("event source type", event geteventsourcetype()); dimensions put("event type", event geteventtype()); metering() meter(customerid, metername, metervalue, eventtime, dimensions); logger info("amberflo ingestion event id {}, customerid {}, meter {}, event source type {}, event type {}", event getid(), customerid, metername, dimensions get("event source type"), dimensions get("event type")); } catch (exception ex) { logger error("amberflo ingestion failed {}", ex getmessage()); ex printstacktrace(); } } }