Packages
appsignal
2.0.8
2.17.4
2.17.3
2.17.2
2.17.1
2.17.0
2.16.0
2.15.11
2.15.10
2.15.9
2.15.8
2.15.7
2.15.6
2.15.5
2.15.4
2.15.3
2.15.2
2.15.1
2.15.0
2.14.1
2.14.0
2.13.4
2.13.3
2.13.2
2.13.1
2.13.0
2.12.3
2.12.2
2.12.1
2.12.0
2.11.0
2.10.2
2.10.1
2.10.0
2.9.2
2.9.1
2.9.0
2.8.3
2.8.2
2.8.1
2.8.0
2.7.13
2.7.12
2.7.11
2.7.10
2.7.9
2.7.8
2.7.7
2.7.6
2.7.5
2.7.4
2.7.3
2.7.2
2.7.1
2.7.0
2.7.0-beta.1
2.6.1
2.6.0
2.5.3
2.5.2
2.5.1
2.5.0
2.4.3
2.4.2
2.4.1
2.4.0
2.3.1
2.3.0
2.2.19
2.2.18
2.2.17
2.2.16
2.2.15
2.2.14
2.2.13
2.2.12
retired
2.2.11
2.2.10
2.2.9
2.2.8
2.2.7
2.2.6
2.2.5
2.2.4
2.2.3
2.2.2
2.2.1
2.2.0
2.1.15
2.1.14
2.1.13
2.1.12
2.1.11
2.1.10
2.1.9
2.1.8
2.1.7
2.1.7-beta.1
2.1.6
2.1.5
2.1.4
2.1.3
2.1.2
2.1.1
2.1.0
2.0.8
2.0.7
2.0.6
2.0.6-beta.1
2.0.5
retired
2.0.4
retired
2.0.3
retired
2.0.2
retired
2.0.1
retired
2.0.0
retired
2.0.0-beta.11
2.0.0-beta.10
2.0.0-beta.9
2.0.0-beta.8
2.0.0-beta.7
2.0.0-beta.6
2.0.0-beta.5
2.0.0-beta.4
2.0.0-beta.3
2.0.0-beta.2
2.0.0-beta.1
2.0.0-alpha.7
2.0.0-alpha.6
2.0.0-alpha.5
2.0.0-alpha.4
2.0.0-alpha.3
2.0.0-alpha.2
2.0.0-alpha.1
1.13.5
1.13.4
1.13.3
1.13.2
1.13.1
1.13.0
1.13.0-beta.2
1.13.0-beta.1
1.12.1
1.12.0
1.12.0-beta.3
1.12.0-beta.2
1.12.0-beta.1
1.11.8
1.11.7
1.11.6
1.11.5
1.11.4
1.11.3
1.11.2
1.11.1
1.11.0
1.11.0-beta.1
1.10.13
1.10.12
1.10.11
1.10.10
1.10.9
1.10.8
1.10.7
1.10.6
1.10.5
1.10.4
1.10.3
1.10.2
1.10.1
1.10.0
1.9.4
1.9.3
1.9.2
1.9.1
1.9.1-beta.1
1.9.0
1.9.0-beta.1
1.9.0-alpha.1
1.8.2
1.8.1
1.8.1-beta.2
1.8.1-beta.1
1.8.0
1.7.2
1.7.1
1.7.0
1.7.0-beta.2
1.7.0-beta.1
1.7.0-alpha.4
1.7.0-alpha.3
1.7.0-alpha.2
1.7.0-alpha.1
1.6.7
1.6.6
1.6.6-beta.2
1.6.6-beta.1
1.6.5
1.6.4
1.6.3
1.6.2
1.6.1
1.6.0
1.6.0-beta.1
1.6.0-alpha.1
1.5.1
1.5.0
1.5.0-beta.2
1.5.0-beta.1
1.4.11-beta.1
1.4.10
1.4.9
1.4.8
1.4.7
1.4.6
1.4.5
1.4.4
1.4.3
1.4.2
1.4.1
1.4.0
1.4.0-alpha.1
1.3.6
1.3.6-beta.1
1.3.5
1.3.4
1.3.4-beta.1
1.3.3
1.3.2
1.3.1
1.3.0
1.3.0-beta.3
1.3.0-beta.2
1.3.0-beta.1
1.2.3
1.2.2
1.2.1
1.2.0
1.1.1
1.1.0
1.0.4
1.0.3
1.0.2
1.0.1
1.0.0
1.0.0-rc.1
0.13.0
0.12.3
0.12.2
0.12.1
0.12.0
0.11.6
0.11.5
0.11.4
0.11.3
0.11.2
0.11.1
0.11.0
0.10.0
0.9.2
0.9.1
0.9.0
0.8.0
0.7.1
0.7.0
0.6.2
0.6.1
0.6.0
0.5.0
0.4.0
0.3.0
0.2.0
0.1.0
0.0.9
0.0.8
0.0.7
0.0.6
0.0.5
0.0.4
0.0.3
0.0.2
0.0.1
Collects error and performance data from your Elixir applications and sends it to AppSignal
Current section
Files
Jump to
Current section
Files
c_src/appsignal.h
/**
* AppSignal public interface
*
* Contact us at support@appsignal.com if you want to integrate this into whichever
* tool you're using and have any questions or remarks! We'd love to help you.
*
* This interface is expected to be stable, but we reserve the right to make changes to
* it if we have a pressing reason to do so.
*/
/**
* Representation of a String. buf is expected to contain a valid
* UTF-8 string with the specified len.
*/
typedef struct {
size_t len;
const char* buf;
} appsignal_string_t;
/*
* Pointer to a transaction instance that's used to gather data on
* a running transaction.
*/
typedef void appsignal_transaction_t;
/*
* Pointer to a span instance that's used to gather data on
* a running request or transcation.
*/
typedef void appsignal_span_t;
/*
* Pointer to a data instance that's used to build up sample data.
*/
typedef void appsignal_data_t;
/*
* Put an environment value to a local appsignal set that will be merged
* with the system environment when loading configuration.
*
* @param key of the configuration
* @param value of the configuration
*/
void appsignal_env_put(appsignal_string_t, appsignal_string_t);
/*
* Get a local appsignal environment value.
*
* @param key of the configuration
*
* @return the value of the configuration
*/
appsignal_string_t appsignal_env_get(appsignal_string_t);
/*
* Delete a local appsignal environment value.
*
* @param key of the configuration
*/
void appsignal_env_delete(appsignal_string_t);
/*
* Clear the local appsignal environment.
*/
void appsignal_env_clear();
/*
* Start appsignal extension
*
* This initializes the extension and boots an appsignal agent
* daemon if it's not already running. Before calling this valid
* configuration needs to be present in the environment:
*
* _APPSIGNAL_ACTIVE: extension starts if value is true
* _APPSIGNAL_APP_PATH: path to the app we're monitoring
* _APPSIGNAL_AGENT_PATH: Path to directory where extension and agent are installed
* _APPSIGNAL_LOG_PATH: Path to write logs to
* _APPSIGNAL_PUSH_API_ENDPOINT: Endpoint to post data to (https://push.appsignal.com)
* _APPSIGNAL_PUSH_API_KEY: Key you get in the installation wizard on https://appsignal.com
* _APPSIGNAL_APP_NAME: Name of the application we're monitoring
* _APPSIGNAL_ENVIRONMENT: Environment we're monitoring (staging, production)
* _APPSIGNAL_AGENT_VERSION: Version of the agent we're running
* _APPSIGNAL_TRANSMISSION_INTERVAL: Optional, amount of time between transmissions. Default is 30
* _APPSIGNAL_WORKING_DIR_PATH: Optional, set a specific path to store appsignal tmp files
* _APPSIGNAL_DIAGNOSE: Optional, run extension and agent in diagnose mode and
* exit. Only works in combination with `appsignal_diagnose`.
*
* This function needs to be called before calling other functions, otherwise the other
* functions will fail silently.
*/
void appsignal_start(void);
/*
* Stops appsignal worker thread and wait for the last data to flush the agent.
*/
void appsignal_stop(void);
/*
* Starts appsignal extension and agent in diagnose mode and returns result in JSON string.
* Only works in combination with`_APPSIGNAL_DIAGNOSE`.
*/
appsignal_string_t appsignal_diagnose(void);
/*
* Get state information that the server possibly sent.
*
* @param key of the state information
*
* @return piece of state information
*/
appsignal_string_t appsignal_get_server_state(appsignal_string_t);
/*
* Start a transaction
*
* Call this when a transaction such as a http request or background job starts.
*
* @param transaction_id The unique identifier of this transaction
* @param namespace The namespace of this transaction (http_request, background_job)
* @param gc_duration_ms The current garbage collection duration in milliseconds
*
* @return pointer to this transaction for use with the the other transaction functions
* store this in a thread or fiber/coroutine local variable
*/
appsignal_transaction_t* appsignal_start_transaction(appsignal_string_t, appsignal_string_t, long);
/*
* Start an event
*
* Call this when an event within a transaction you want to measure starts, such as
* an SQL query or http request.
*
* @param transaction The pointer to the transaction this event occurred in
* @param gc_duration_ms The current garbage collection duration in milliseconds
*/
void appsignal_start_event(appsignal_transaction_t*, long);
/*
* Finish an event
*
* Call this when an event ends.
*
* @param transaction The pointer to the transaction this event occurred in
* @param name Name of the category of the event (sql.query, net.http)
* @param title Title of the event ('User load', 'Http request to google.com')
* @param body Body of the event, should not contain unique information per specific event ('select * from users where id=?')
* @param body_format Format of the event's body which can be used for sanitization, 0 for general and 1 for sql currently.
* @param gc_duration_ms The current garbage collection duration in milliseconds
*/
void appsignal_finish_event(appsignal_transaction_t*, appsignal_string_t, appsignal_string_t, appsignal_string_t, int, long);
/*
* Finish an event with data payload
*
* Call this when an event ends.
*
* @param transaction The pointer to the transaction this event occurred in
* @param name Name of the category of the event (sql.query, net.http)
* @param title Title of the event ('User load', 'Http request to google.com')
* @param body Body of the event, should not contain unique information per specific event ('select * from users where id=?')
* @param body_format Format of the event's body which can be used for sanitization, 0 for general and 1 for sql currently.
* @param gc_duration_ms The current garbage collection duration in milliseconds*
*/
void appsignal_finish_event_data(appsignal_transaction_t*, appsignal_string_t, appsignal_string_t, appsignal_data_t*, int, long);
/*
* Record a finished event
*
* Call this when an event which you cannot track the start for ends. This function can only be used for events that do not
* have children such as database queries. GC metrics and allocation counts will be tracked in the parent of this event.
*
* @param transaction The pointer to the transaction this event occurred in
* @param name Name of the category of the event (sql.query, net.http)
* @param title Title of the event ('User load', 'Http request to google.com')
* @param body Body of the event, should not contain unique information per specific event ('select * from users where id=?')
* @param body_format Format of the event's body which can be used for sanitization, 0 for general and 1 for sql currently.
* @param duration Duration of this event in nanoseconds
* @param gc_duration_ms The event's total garbage collection duration in milliseconds
*/
void appsignal_record_event(appsignal_transaction_t*, appsignal_string_t, appsignal_string_t, appsignal_string_t, int, long, long);
/*
* Record a finished event with data payload
*
* Call this when an event which you cannot track the start for ends. This function can only be used for events that do not
* have children such as database queries. GC metrics and allocation counts will be tracked in the parent of this event.
*
* @param transaction The pointer to the transaction this event occurred in
* @param name Name of the category of the event (sql.query, net.http)
* @param title Title of the event ('User load', 'Http request to google.com')
* @param body Body of the event, should not contain unique information per specific event ('select * from users where id=?')
* @param body_format Format of the event's body which can be used for sanitization, 0 for general and 1 for sql currently.
* @param duration Duration of this event in nanoseconds
* @param gc_duration_ms The current garbage collection duration in milliseconds
*/
void appsignal_record_event_data(appsignal_transaction_t*, appsignal_string_t, appsignal_string_t, appsignal_data_t*, int, long, long);
/*
* Set an error for a transaction
*
* Call this when an error occurs within a transaction.
*
* @param transaction The pointer to the transaction this event occurred in
* @param name Name of the error (RuntimeError)
* @param message Message of the error ('undefined method call for something')
* @param backtrace backtrace of the error
*/
void appsignal_set_transaction_error(appsignal_transaction_t*, appsignal_string_t, appsignal_string_t, appsignal_data_t*);
/*
* Set sample data for a transaction
*
* Use this to add sample data if finish_transaction returns true.
*
* @param transaction The pointer to the transaction this event occurred in
* @param key Key of this piece of sample data (params, session_data)
* @param payload This sample data
*/
void appsignal_set_transaction_sample_data(appsignal_transaction_t*, appsignal_string_t, appsignal_data_t*);
/*
* Set action of a transaction
*
* Call this when the identifying action of a transaction is known.
*
* @param transaction The pointer to the transaction this event occurred in
* @param action This transactions action (HomepageController#show)
*/
void appsignal_set_transaction_action(appsignal_transaction_t*, appsignal_string_t);
/*
* Set namespace of a transaction
*
* Override the initially given namespace if you want to customize it later on.
*
* @param transaction The pointer to the transaction this event occurred in
* @param namespace This transactions overridden namespace
*/
void appsignal_set_transaction_namespace(appsignal_transaction_t*, appsignal_string_t);
/*
* Set queue start time of a transaction
*
* Call this when the queue start time in miliseconds is known.
*
* @param transaction The pointer to the transaction this event occurred in
* @param queue_start Transaction queue start time in ms if known, otherwise -1
*/
void appsignal_set_transaction_queue_start(appsignal_transaction_t*, long);
/*
* Set metadata for a transaction
*
* Call this when an error occurs within a transaction to set more detailed data about the error
*
* @param transaction The pointer to the transaction this event occurred in
* @param key Key of this piece of metadata (user_id, email)
* @param value Value of this piece of metadata (thijs@appsignal.com)
*/
void appsignal_set_transaction_metadata(appsignal_transaction_t*, appsignal_string_t, appsignal_string_t);
/*
* Finish a transaction
*
* Call this when a transaction such as a http request or background job ends.
*
* @param transaction The pointer to the transaction this event occurred in
* @param gc_duration_ms The current garbage collection duration in milliseconds
*
* @return whether or not sample data for this transaction should be collected and added.
* 1 for true, 0 for false.
*/
int appsignal_finish_transaction(appsignal_transaction_t*, long);
/*
* Complete a transaction
*
* Call this after finishing a transaction (and adding sample data if necessary).
*
* @param transaction The pointer to the transaction this event occurred in
*/
void appsignal_complete_transaction(appsignal_transaction_t*);
/*
* Get content of a transaction in JSON format, intended for testing purposes.
*/
appsignal_string_t appsignal_transaction_to_json(appsignal_transaction_t*);
/*
* Free a transaction
*
* Call this when a transaction will not be used anymore, mostly used as a callback
* from the host processes' GC.
*
* @param transaction The pointer to the transaction this event occurred in
*/
void appsignal_free_transaction(appsignal_transaction_t*);
/*
* Create new data map
*/
appsignal_data_t* appsignal_data_map_new(void);
/*
* Create new data map that is automatically filtered using the keys that
* are configured in the env var _APPSIGNAL_FILTER_DATA_KEYS
*/
appsignal_data_t* appsignal_data_filtered_map_new(void);
/*
* Set values on a data map. Warning: These functions are not thread-safe,
* always call them on a data from a single thread.
*
* @param data The pointer to the data object
* @param key the field's key, always a string
* @param value the field's value to set, multiple types
*/
void appsignal_data_map_set_string(appsignal_data_t*, appsignal_string_t, appsignal_string_t);
void appsignal_data_map_set_integer(appsignal_data_t*, appsignal_string_t, long);
void appsignal_data_map_set_float(appsignal_data_t*, appsignal_string_t, double);
void appsignal_data_map_set_boolean(appsignal_data_t*, appsignal_string_t, int);
void appsignal_data_map_set_null(appsignal_data_t*, appsignal_string_t);
void appsignal_data_map_set_data(appsignal_data_t*, appsignal_string_t, appsignal_data_t*);
/*
* Create new data array object
*/
appsignal_data_t* appsignal_data_array_new(void);
/*
* Append values to a data array. Warning: These functions are not thread-safe,
* always call them on a data from a single thread.
*
* @param data The pointer to the data object
* @param value the value to append, multiple types
*/
void appsignal_data_array_append_string(appsignal_data_t*, appsignal_string_t);
void appsignal_data_array_append_integer(appsignal_data_t*, long);
void appsignal_data_array_append_float(appsignal_data_t*, double);
void appsignal_data_array_append_boolean(appsignal_data_t*, int);
void appsignal_data_array_append_null(appsignal_data_t*);
void appsignal_data_array_append_data(appsignal_data_t*, appsignal_data_t*);
/*
* Get content of a data in JSON format, intended for testing purposes.
*/
appsignal_string_t appsignal_data_to_json(appsignal_data_t*);
/*
* Checks whether or not two data objects have equal content.
*/
int appsignal_data_equal(appsignal_data_t*, appsignal_data_t*);
/*
* Free a data object
*/
void appsignal_free_data(appsignal_data_t*);
/*
* Track allocation
*
* Optional: Call this when an object is allocated, some languages provide hooks for
* tracking this.
*/
void appsignal_track_allocation(void);
/*
* Set a gauge
*
* Set a gauge for a measurement of some metric.
*
* @param key Key of the metric
* @param value Measured value
* @param tags for the metric
*/
void appsignal_set_gauge(appsignal_string_t, double, appsignal_data_t*);
/*
* Set a host gauge
*
* DEPRECATED: Calling this function has no effect anymore.
*
* @param key Key of the metric
* @param value Measured value
*/
void appsignal_set_host_gauge(appsignal_string_t, double);
/*
* Set a process gauge
*
* DEPRECATED: Calling this function has no effect anymore.
*
* @param key Key of the metric
* @param value Measured value
*/
void appsignal_set_process_gauge(appsignal_string_t, double);
/*
* Increment a counter
*
* Increment a counter of some metric.
*
* @param key Key of the metric
* @param value Number to increment with
* @param tags for the metric
*/
void appsignal_increment_counter(appsignal_string_t, double, appsignal_data_t*);
/*
* Add a value to a distribution
*
* Add a value to the distribution to some metric. Use this to collect multiple
* data points that will be merged into a graph.
*
* @param key Key of the metric
* @param value Measured value
* @param tags for the metric
*/
void appsignal_add_distribution_value(appsignal_string_t, double, appsignal_data_t*);
/*
* Check if the agent is running in a container.
*
* Returns 1 if the agent is running in a container, or 0 otherwise.
*/
int appsignal_running_in_container(void);
/*
* Add environment metadata values
*
* @param key String key of the metadata
* @param value String value of the metadata
*/
void appsignal_set_environment_metadata(appsignal_string_t, appsignal_string_t);
/*
* Create a new root span.
*
* @param namespace Namespace this span is in
*/
appsignal_span_t* appsignal_create_root_span(appsignal_string_t);
/*
* Create a new root span with a timestamp.
*
* @param namespace Namespace this span is in
* @param sec Seconds since UTC epoch
* @param nsec Nanoseconds since second-based timestamp
*/
appsignal_span_t* appsignal_create_root_span_with_timestamp(appsignal_string_t, long, long);
/*
* Create a new child span span.
*
* @param parent Pointer to the parent span
*/
appsignal_span_t* appsignal_create_child_span(appsignal_span_t*);
/*
* Create a new child span with a timestamp.
*
* @param parent Pointer to the parent span
* @param sec Seconds since UTC epoch
* @param nsec Nanoseconds since second-based timestamp
*/
appsignal_span_t* appsignal_create_child_span_with_timestamp(appsignal_span_t*, long, long);
/*
* Whether we are recording the current trace. If we are not is not necessary to
* create child spans, ony the root span should be created and closed.
*
* @param span Pointer to the span
*
* Returns 1 if we are tracing, 0 if we are not
*/
int appsignal_record_trace(appsignal_span_t*);
/*
* Get a json representation of this span, mostly used for tests.
*
* @param span Pointer to the span
*/
appsignal_string_t appsignal_span_to_json(appsignal_span_t*);
/*
* Set a span's name, for example HomepageController#show or sql.query.
*
* @param span Pointer to the span
* @param name The span's name
*/
void appsignal_set_span_name(appsignal_span_t*, appsignal_string_t);
/*
* Set s span's namespace.
*
* Override the initially given namespace if you want to customize it later on.
*
* @param span Pointer to the span
* @param namespace This span's new namespace
*/
void appsignal_set_span_namespace(appsignal_span_t*, appsignal_string_t);
/*
* Add an error to a span. Currently only errors added to root spans are processed.
*
* @param span Pointer to the span
* @param name The error's name
* @param name The error's message
* @param name The error's backtrace, should be an array
*/
void appsignal_add_span_error(appsignal_span_t*, appsignal_string_t, appsignal_string_t, appsignal_data_t*);
/*
* Set a span's name, for example HomepageController#show or sql.query.
*
* @param span Pointer to the span
* @param key Key of this piece of sample data (params, session_data)
* @param payload This sample data
*/
void appsignal_set_span_sample_data(appsignal_span_t*, appsignal_string_t, appsignal_data_t*);
/*
* Set a string attribute on a span
*
* @param span Pointer to the span
* @param key Key of the attribute
* @param value Value of the attribute
*/
void appsignal_set_span_attribute_string(appsignal_span_t*, appsignal_string_t, appsignal_string_t);
/*
* Set a string attribute on a span, where the body is expected to be SQL data
*
* @param span Pointer to the span
* @param key Key of the attribute
* @param value Value of the attribute
*/
void appsignal_set_span_attribute_sql_string(appsignal_span_t*, appsignal_string_t, appsignal_string_t);
/*
* Set an integer attribute on a span
*
* @param span Pointer to the span
* @param key Key of the attribute
* @param value Value of the attribute
*/
void appsignal_set_span_attribute_int(appsignal_span_t*, appsignal_string_t, long);
/*
* Set a boolean attribute on a span
*
* @param span Pointer to the span
* @param key Key of the attribute
* @param value Value of the attribute
*/
void appsignal_set_span_attribute_bool(appsignal_span_t*, appsignal_string_t, int);
/*
* Set a double attribute on a span
*
* @param span Pointer to the span
* @param key Key of the attribute
* @param value Value of the attribute
*/
void appsignal_set_span_attribute_double(appsignal_span_t*, appsignal_string_t, double);
/*
* Close a span. The span will be flushed and functions on it's functions will
* be noops afterwards.
*
* @param span Pointer to the span
*/
void appsignal_close_span(appsignal_span_t*);
/*
* Close a span with a timestamp.
*
* @param span Pointer to the span
* @param sec Seconds since UTC epoch
* @param nsec Nanoseconds since second-based timestamp
*/
void appsignal_close_span_with_timestamp(appsignal_span_t*, long, long);
/*
* Free a span
*
* Call this when a span will not be used anymore, mostly used as a callback
* from the host processes' GC.
*
* @param span Pointer to the span
*/
void appsignal_free_span(appsignal_span_t*);