Instrument your application using Dynatrace OpenKit
Monitoring data sent via Dynatrace OpenKit is encapsulated into an entity that represents your application called a custom application. Therefore, to monitor your application, you need to define and instrument the custom application following the instructions below.
Step 1: Define the custom application
- From the navigation menu, select Deploy Dynatrace.
- Within the Digital touchpoint monitoring section, click the Monitor custom application button.
- Type a name for your custom application.
- Select an icon to visually represent your custom application in the Dynatrace UI.
- Click the Monitor custom application button.
- You’ll be directed to the instrumentation page of your new custom application. From here, you can download Dynatrace OpenKit from GitHub and instrument your application using the provided
Beacon URL
andApplicationID
. The Beacons view below is especially handy as it shows you incoming beacons as they arrive, with only a couple of seconds delay. This view also provides information about potential problems.
Step 2: Instrument the custom application
To instrument your custom applications, use the Dynatrace OpenKit libraries that are available for download.
Basic instrumentation example
Here’s a basic example that shows you how to use Dynatrace OpenKit to send monitoring data to Dynatrace. For more details on the Dynatrace OpenKit API, visit Dynatrace OpenKit API methods.
// Obtain an OpenKit instance
String applicationName = "My OpenKit application"; // Your application's name
String applicationID = "application-id"; // Your application's ID
long deviceID = 42; // Replace with a unique value per device/installation
String endpointURL = "https://tenantid.beaconurl.com"; // Dynatrace endpoint URL
OpenKit openKit = new DynatraceOpenKitBuilder(endpointURL, applicationID, deviceID)
.withApplicationName(applicationName)
.withApplicationVersion("1.0.0.0")
.withOperatingSystem("Windows 10")
.withManufacturer("MyCompany")
.withModelID("MyModelID")
.build();
// Wait up to 10 seconds for OpenKit to complete initialization
long timeoutInMilliseconds = 10 * 1000;
boolean success = openKit.waitForInitCompletion(timeoutInMilliseconds);
// Create session
String clientIP = "8.8.8.8";
Session session = openKit.createSession(clientIP);
// Identify user
session.identifyUser("jane.doe@example.com");
// Create root and child actions
String rootActionName = "rootActionName";
RootAction rootAction = session.enterAction(rootActionName);
String childActionName = "childAction";
Action childAction = rootAction.enterAction(childActionName);
// Leave action
childAction.leaveAction();
rootAction.leaveAction();
// Finish session
session.end();
// Terminate OpenKit instance
openKit.shutdown();
// Obtain an OpenKit instance
string applicationName = "My OpenKit application"; // Your application's name
string applicationID = "application-id"; // Your application's ID
long deviceID = 42L; // Replace with a unique value per device/installation
string endpointURL = "https://tenantid.beaconurl.com/mbeacon"; // Dynatrace endpoint URL
IOpenKit openKit = new DynatraceOpenKitBuilder(endpointURL, applicationID, deviceID)
.WithApplicationName(applicationName)
.WithApplicationVersion("1.0.0.0")
.WithOperatingSystem("Windows 10")
.WithManufacturer("MyCompany")
.WithModelID("MyModelID")
.Build();
// Wait up to 10 seconds for OpenKit to complete initialization
int timeoutInMilliseconds = 10 * 1000;
bool success = openKit.WaitForInitCompletion(timeoutInMilliseconds);
// Create session
string clientIP = "8.8.8.8";
ISession session = openKit.CreateSession(clientIP);
// Identify user
session.IdentifyUser("jane.doe@example.com");
// Create root and child actions
string rootActionName = "rootActionName";
IRootAction rootAction = session.EnterAction(rootActionName);
string childActionName = "childAction";
IAction childAction = rootAction.EnterAction(childActionName);
// Leave action
childAction.LeaveAction();
rootAction.LeaveAction();
// Finish session
session.End();
// Terminate OpenKit instance
openKit.ShutDown();
// Obtain an OpenKit instance
const char* applicationName = "My OpenKit application"; // Your application's name
const char* applicationID = "application-id"; // Your application's ID
int64_t deviceID = 42; // Replace with a unique value per device/installation
const char* endpointURL = "https://tenantid.beaconurl.com/mbeacon"; // Dynatrace endpoint URL
std::shared_pointer<openkit::IOpenKit> openKit =
openkit::DynatraceOpenKitBuilder(endpointURL, applicationID, deviceID)
.withApplicationName(applicationName)
.withApplicationVersion("1.0.0.0")
.withOperatingSystem("Windows 10")
.withManufacturer("MyCompany")
.withModelID("MyModelID")
.build();
// Wait up to 10 seconds for OpenKit to complete initialization
int64_t timeoutInMilliseconds = 10 * 1000;
bool success = openKit->waitForInitCompletion(timeoutInMilliseconds);
// Create session
const char* clientIP = "8.8.8.8";
std::shared_ptr<openkit::ISession> session = openKit->createSession(clientIP);
// Identify user
session->identifyUser("jane.doe@example.com");
// Create root and child actions
const char* rootActionName = "rootActionName";
std::shared_ptr<IRootAction> rootAction = session->enterAction(rootActionName);
const char* childActionName = "childAction";
std::shared_ptr<IRootAction> childAction = rootAction->enterAction(childActionName);
// Leave action
childAction->leaveAction();
rootAction->leaveAction();
// Finish session
session->end();
// Terminate OpenKit instance
openKit->shutdown();
// Obtain an OpenKit instance
const char* applicationName = "My OpenKit application"; // Your application's name
const char* applicationID = "application-id"; // Your application's ID
int64_t deviceID = 42; // Replace with a unique value per device/installation
const char* endpointURL = "https://tenantid.beaconurl.com/mbeacon"; // Dynatrace endpoint URL
struct OpenKitConfigurationHandle* configurationHandle = createOpenKitConfiguration(endpointURL, applicationID, deviceID);
useApplicationNameForConfiguration(configurationHandle, applicationName);
useApplicationVersionForConfiguration(configurationHandle, "1.0.0.0");
useOperatingSystemForConfiguration(configurationHandle, "Windows 10");
useManufacturerForConfiguration(configurationHandle, "MyCompany");
useModelIDForConfiguration(configurationHandle, "MyModelID");
struct OpenKitHandle* openKit = createDynatraceOpenKit(configurationHandle);
// Wait up to 10 seconds for OpenKit to complete initialization
int64_t timeoutInMilliseconds = 10 * 1000;
bool success = waitForInitCompletionWithTimeout(openKit, timeoutInMilliseconds);
// Create session
const char* clientIP = "8.8.8.8";
struct SessionHandle* session = createSession(openKit, clientIP);
// Identify user
identifyUser(session, "jane.doe@example.com");
// Create root and child actions
const char* rootActionName = "rootActionName";
struct RootActionHandle* rootAction = enterRootAction(session, rootActionName);
const char* childActionName = "childAction";
struct ActionHandle* childAction = enterAction(rootAction, childActionName);
// Leave action
leaveAction(childAction);
leaveRootAction(rootAction);
// Finish session
endSession(session);
// Terminate OpenKit instance
shutdownOpenKit(openKit);
Monitoring example
Once your custom application begins to send monitoring data to Dynatrace, you can analyze the data just like any other application. Have a look at the example Custom IoT application page below.
You can view all your user actions by clicking the View all user actions button in the Top actions section (see above).
From here you can continue to the list of user action instances and view detailed timings for individual user actions.