VMware Aria Operations™ for Applications Python SDK
Table of Content
Overview
VMware Aria Operations for Applications (formerly known as Tanzu Observability by Wavefront) Python SDK lets you send raw data from your Python application to Operations for Applications using a wavefront_sender interface. The data is then stored as metrics, histograms, and trace data. This SDK is also referred to as the Wavefront Sender SDK for Python.
Although this library is mostly used by the other Operations for Applications Python SDKs to send data to Operations for Applications, you can also use this SDK directly. For example, you can send data directly from a data store or CSV file to Operations for Applications.
Note: We're in the process of updating the product name to Operations for Applications, but in many places we still refer to it as Wavefront.
Prerequisites
-
Python versions 3.8 - 3.11 are supported.
-
Install wavefront-sdk-python
:
pip install wavefront-sdk-python
Set Up a Sender
You can send metrics, histograms, or trace data from your application to the service using a Wavefront Proxy or direct ingestions.
- Use direct ingestion to send the data directly to the service. This is the simplest way for POC environment to get it running quickly.
- Use a Wavefront Proxy, which forwards the data to the service. This is the recommended way for a production environment and large-scale deployment that needs resilience to internet outages, control over data queuing and filtering, and more.
Let's create a WavefrontClient
to send data to Operations for Applications either through the Wavefront Proxy or directly over HTTP.
Deprecated implementations: WavefrontDirectClient
and WavefrontProxyClient
are deprecated starting with Wavefront proxy version 7.0. We recommend all new applications to use the WavefrontClient
.
Create a WavefrontClient
Use WavefrontClientFactory
to create a WavefrontClient
instance, which can send data directly to the service or send data using a Wavefront proxy.
The WavefrontClientFactory
supports multiple client bindings. If more than one client configuration is specified, you can create a WavefrontMultiClient
instance, which can send data to multiple services.
Initialize the WavefrontClient (Wavefront Proxy/Direct Ingestion)
Prerequisites (Wavefront Proxy/Direct Ingestion)
- Sending data by using the Wavefront proxy?
Before your application can use a
WavefrontClient
you must install a Wavefront proxy. - Sending data by using direct ingestion?
Example: Use a factory class to create a WavefrontClient and send data to Operations for Applications through a Wavefront proxy or using direct ingestion.
from wavefront_sdk.client_factory import WavefrontClientFactory
client_factory = WavefrontClientFactory()
client_factory.add_client(
url="<URL for proxy or direct ingestions>",
max_queue_size=50000,
batch_size=10000,
flush_interval_seconds=5)
wavefront_sender = client_factory.get_client()
Initialize the WavefrontClient with a VMware Cloud Services API Token
Prerequisites (VMware Cloud Services API Token)
- The HTTP URL of your cluster. This is the URL you connect to when you log in to the service, typically something like
http://<domain>.wavefront.com
. - The base HTTP URL of your VMware Cloud Services Console. This is the URL you connect to when you log in to the VMware Cloud Services Console, typically something like
http://console.cloud.vmware.com
. - Verify that you have access to the VMware Cloud Services Console. For details, see Operations for Applications Permissions.
- Generating an API token.
Example: Use a factory class to create a WavefrontClient and send data to Operations for Applications via VMware Cloud Services API Token.
from wavefront_sdk.client_factory import WavefrontClientFactory
client_factory = WavefrontClientFactory()
client_factory.add_client(
url="<URL for direct ingestions>",
csp_base_url='<URL for csp authentication>',
csp_api_token="<Token for csp api>",
max_queue_size=50000,
batch_size=10000,
flush_interval_seconds=5)
wavefront_sender = client_factory.get_client()
Initialize the WavefrontClient with a Server to Server OAuth App
Prerequisites (Server to Server OAuth App)
- The HTTP URL of your cluster. This is the URL you connect to when you log in to the service, typically something like
http://<domain>.wavefront.com
. - The base HTTP URL of your VMware Cloud Services Console. This is the URL you connect to when you log in to the VMware Cloud Services Console, typically something like
http://console.cloud.vmware.com
. - Verify that you have the required permissions for adding and managing OAuth apps in this Organization. For details, see Organization roles and permissions.
- Create a server to server app.
Example: Use a factory class to create a WavefrontClient and send data to Operations for Applications by using the server to server OAuth app.
from wavefront_sdk.client_factory import WavefrontClientFactory
client_factory = WavefrontClientFactory()
client_factory.add_client(
url="<URL for direct ingestions>",
csp_base_url='<URL for csp authentication>',
csp_app_id="<ID for csp oauth app>",
csp_app_secret="<Secret for csp oauth app>",
csp_org_id="<ID for csp organization>",
max_queue_size=50000,
batch_size=10000,
flush_interval_seconds=5)
wavefront_sender = client_factory.get_client()
Add multiple clients to client factory to send data to multiple services
Example: Creating a WavefrontMultiClient
to send data to multiple Operations for Applications services.
from wavefront_sdk.client_factory import WavefrontClientFactory
client_factory = WavefrontClientFactory()
client_factory.add_client("proxy://our.proxy.lb.com:2878")
client_factory.add_client("https://someToken@DOMAIN.wavefront.com")
client_factory.add_client("http://<proxy_hostname>:30000")
wavefront_sender = client_factory.get_client()
Send Data
Operations for Applications supports different metric types, such as gauges, counters, delta counters, histograms, traces, and spans. See Metrics for details. To send data to Operations for Applications using the wavefront_sender
you need to instantiate the following:
Send a Single Data Point
The following examples show how to send a single data point to the service. You use the Wavefront Sender you created above.
Single Metric or Delta Counter
from uuid import UUID
wavefront_sender.send_metric(
name="new_york.power.usage",
value=42422.0,
timestamp=1533529977,
source="localhost",
tags={"datacenter": "dc1"})
wavefront_sender.send_delta_counter(
name="delta.counter",
value=1.0,
source="localhost",
tags={"datacenter": "dc1"})
Note: If your metric name has a bad character, that character is replaced with a -
.
Single Histogram Distribution
from uuid import UUID
from wavefront_sdk.entities.histogram import histogram_granularity
wavefront_sender.send_distribution(
name="request.latency",
centroids=[(30, 20), (5.1, 10)],
histogram_granularities={histogram_granularity.DAY,
histogram_granularity.HOUR,
histogram_granularity.MINUTE},
timestamp=1533529977,
source="appServer1",
tags={"region": "us-west"})
Single Span
If you are directly using the Sender SDK to send data to the service, you won’t see span-level RED metrics by default unless you use the Wavefront proxy and define a custom tracing port (tracing_port
). See Instrument Your Application with the Sender SDKs for details.
from uuid import UUID
wavefront_sender.send_span(
name="getAllUsers",
start_millis=1533529977,
duration_millis=343500,
source="localhost",
trace_id=UUID("7b3bf470-9456-11e8-9eb6-529269fb1459"),
span_id=UUID("0313bafe-9457-11e8-9eb6-529269fb1459"),
parents=[UUID("2f64e538-9457-11e8-9eb6-529269fb1459")],
follows_from=None,
tags=[("application", "Wavefront"),
("service", "istio"),
("http.method", "GET")],
span_logs=None)
Single Event
wavefront_sender.send_event('event name',
1592200048,
1592201048,
"localhost",
["env:", "dev"],
{"severity": "info",
"type": "backup",
"details": "broker backup"})
Send Batch Data
The following examples show how to generate data points manually and send them as a batch to Operations for Applications.
Batch Metrics
from uuid import UUID
from wavefront_sdk.common import metric_to_line_data
one_metric_data = metric_to_line_data(
name="new-york.power.usage",
value=42422,
timestamp=1493773500,
source="localhost",
tags={"datacenter": "dc1"},
default_source="defaultSource")
batch_metric_data = [one_metric_data, one_metric_data]
wavefront_sender.send_metric_now(batch_metric_data)
Note: If your metric name has a bad character, that character is replaced with a -
.
Batch Histograms
from uuid import UUID
from wavefront_sdk.entities.histogram import histogram_granularity
from wavefront_sdk.common import histogram_to_line_data
one_histogram_data = histogram_to_line_data(
name="request.latency",
centroids=[(30.0, 20), (5.1, 10)],
histogram_granularities={histogram_granularity.MINUTE,
histogram_granularity.HOUR,
histogram_granularity.DAY},
timestamp=1493773500,
source="appServer1",
tags={"region": "us-west"},
default_source ="defaultSource")
batch_histogram_data = [one_histogram_data, one_histogram_data]
wavefront_sender.send_distribution_now(batch_histogram_data)
Batch Trace Data
If you are directly using the Sender SDK to send data to the service, you won’t see span-level RED metrics by default unless you use the Wavefront proxy and define a custom tracing port (tracing_port
). See Instrument Your Application with Wavefront Sender SDKs for details.
from uuid import UUID
from wavefront_sdk.common import tracing_span_to_line_data
one_tracing_span_data = tracing_span_to_line_data(
name="getAllUsers",
start_millis=1552949776000,
duration_millis=343,
source="localhost",
trace_id=UUID("7b3bf470-9456-11e8-9eb6-529269fb1459"),
span_id=UUID("0313bafe-9457-11e8-9eb6-529269fb1459"),
parents=[UUID("2f64e538-9457-11e8-9eb6-529269fb1459")],
follows_from=[UUID("5f64e538-9457-11e8-9eb6-529269fb1459")],
tags=[("application", "Wavefront"), ("http.method", "GET")],
span_logs=None,
default_source="defaultSource")
batch_span_data = [one_tracing_span_data, one_tracing_span_data]
wavefront_sender.send_span_now(batch_span_data)
Batch Events
from wavefront_sdk.common import event_to_line_data
one_event_data = event_to_line_data(
name="event name",
start_time=1592200048,
end_time=1592201048,
source="localhost",
tags=["env", "dev"],
annotations={"severity": "info",
"type": "backup",
"details": "broker backup"})
batch_event_data = [one_event_data, one_event_data]
wavefront_sender.send_event_now(batch_event_data)
Close the Sender
Remember to flush the buffer and close the sender before shutting down the application.
wavefront_sender = client_factory.get_client()
total_failures = wavefront_sender.get_failure_count()
wavefront_sender.flush_now()
wavefront_sender.close()
License
Apache 2.0 License.
Contribute
To get support with our project and contribute, follow the instructions in CONTRIBUTING.md.
To create a new release, follow the instructions in RELEASING.md