As of June 30 2022 we are archiving the C-SDK project. Please explore the option to use OpenTelemetry as an alternative to send C++ telemetry data to New Relic. For more details, see our Explorers Hub announcement.
Release Number | Release Date |
---|---|
1.3.0 | 2020-01-07 |
1.2.0 | 2019-10-09 |
1.1.0 | 2019-06-04 |
1.0.1 | 2019-05-02 |
1.0.0 | 2019-04-23 |
0.1.3 | 2019-03-20 |
0.1.2 | 2019-02-22 |
0.1.1 | 2019-01-25 |
0.1.0 | 2018-12-21 |
0.0.6 | 2018-08-10 |
0.0.5 | 2018-03-12 |
0.0.4 | 2018-02-12 |
0.0.3 | 2018-01-16 |
0.0.2 | 2017-10-30 |
0.0.1 | 2017-09-21 |
-
A default configuration created with
newrelic_create_app_config()
will now work as expected with license keys for non-US accounts. -
For inbound distributed tracing payloads with invalid or missing values for
pr
(priority) and/orsa
(sampled) the agent used to assign a default priority of -1 and/or a default sampled value offalse
to the transaction.This has been fixed, the agent now keeps initial priority and sampled values if the respective values in the inbound distributed tracing payload are missing or invalid.
-
Event data is now sent to New Relic every five seconds, instead of every minute. As a result, transaction, custom, and error events will appear in near-realtime within APM and Insights.
Note that the overall limits on how many events can be sent per minute have not changed. Also, metric and trace data is unaffected, and will still be sent every minute.o
- An error when compiling the test suite with GCC 9.2 was fixed.
More flexibility for container deployments
- The daemon and the instrumented application no longer have to reside on the
same host and can now communicate over an IPv4 or IPv6 TCP socket. For the
instrumented application this can be configured via the
daemon_socket
argument of thenewrelic_init
function. For the daemon this can be configured via the--address
command line option. - When terminating the daemon via the
SIGTERM
signal (and/or theSIGINT
signal if started with the-f
,--foreground
flag), the daemon will now send all buffered data to New Relic prior to exiting. - The daemon has introduced a new configuration
--watchdog-foreground
. This keeps the daemon watchdog process in the foreground, whereas the--foreground
configuration keeps the daemon worker process in the foreground. The new configuration makes it possible to use the daemon in a blocking way, without losing the additional stability provided by the watchdog process. - The C SDK now offers
newrelic_set_transaction_name
with which users may change the name of an already started transaction.
- The daemon now synchronously handles critical code paths related to harvesting and merging transaction data. This prevents crashes caused by race conditions.
- The daemon has introduced a new configuration
--address
which serves as an alias to--port
. Customers may use either to specify the location of the daemon. If both values are set,--address
takes precedence.
-
When starting the daemon, it will now wait for up to three seconds for the listening port to be ready to receive connections before forking into the background. This usually occurs in (much) less than a second, and most users with this configuration will notice no difference in practice.
The time that the daemon will wait can be controlled by setting the
--wait-for-port
setting with a duration. This duration may be 0 to prevent any blocking. If the option is omitted, the default value is3s
.Daemons started in foreground mode (with the
--foreground
flag) are unaffected, and will behave as before.
-
Support for Distributed tracing
Distributed tracing lets you see the path that a request takes as it travels through your distributed system. By showing the distributed activity through a unified view, you can troubleshoot and understand a complex system better than ever before.
Distributed tracing is available with an APM Pro or equivalent subscription. To see a complete distributed trace, you need to enable the feature on a set of neighboring services.
Refer to the New Relic C SDK documentation for more information on enabling distributed tracing for the C SDK.
- The
log_filename
andlog_level
fields ofnewrelic_app_config_t
are currently deprecated. Future versions of the C SDK permanently remove these fields. To specify the log file and log level to use with the C SDK, usenewrelic_configure_log()
.
-
The
newrelic_process_config_t
struct was erroneously left inlibnewrelic.h
when the functionality that used it was refactored intonewrelic_init()
. The struct has been removed.Although this technically constitutes a backward compatibility break, we have decided to do this in a minor release as there was no actual way to use the struct with the API in version 1.0.
This is the first release of the New Relic C SDK! If your application does not use other New Relic APM agent languages, you can use the C SDK to take advantage of New Relic's monitoring capabilities and features to instrument a wide range of applications.
For more information, see:
Documentation: How to get started with the C SDK, install and configure it, instrument transactions, segments, and errors, use the C SDK API, and do some basic troubleshooting.
The previous APM Agent SDK is deprecated beta software. If you were previously using the Agent SDK, you can switch to the C SDK. Check the compatibility and requirements, and then instrument, compile and link your application's code to use the C SDK. The C SDK currently does not support New Relic's HSM feature; this may impact how you schedule your transition away from the Agent SDK.
-
Calculation of transaction total time and metric exclusive time in an asynchronous context has been improved, which should prevent issues resulting in broken transaction charts in APM.
-
Rollup datastore and external segment metrics, used to display application overview charts in APM, have been improved.
-
The C agent now offers
newrelic_set_transaction_timing()
with which users may manually change transaction timing. Though the C agent is incredibly effective at automatically timing transactions, providing users with this kind of timing allows them to achieve consistent timing values across the New Relic Platform and their own internal monitoring systems. -
The C agent now offers
newrelic_set_segment_parent_root()
with which users may manually reparent a segment with the transaction's root segment; this is useful in scenarios in which an asynchronous segment is best represented as a top-level call in the transaction.
-
Application configuration is now completely separate from global configuration.
In practice, this means that uses of
newrelic_config_t
and calls tonewrelic_new_config()
should be replaced withnewrelic_app_config_t
andnewrelic_create_app_config()
, respectively.Logging and daemon socket configuration should now be done by invoking
newrelic_configure_log()
andnewrelic_init()
, respectively.newrelic_init()
must be invoked before the first application is created, otherwise default values will be used. -
newrelic_loglevel_t
constant names are now prefixed withNEWRELIC_
.
-
Custom events can now be sent using the new Custom Events API. Events are created via the
newrelic_create_custom_event
function, and attributes may be added to custom events via thenewrelic_custom_event_add_*
family of functions. See GUIDE.md for usage information. -
Custom metrics can now be sent using the new Custom Metrics API. See GUIDE.md for usage information.
-
Segments may now be reparented manually using the new
newrelic_set_segment_parent()
function. -
Segments now support manual timing via the new
newrelic_set_segment_timing()
function.
-
The segment API has been mildly refactored: all segment types are now represented as
newrelic_segment_t
, and thenewrelic_datastore_segment_t
andnewrelic_external_segment_t
types have been removed.Similarly, all segments are now ended with
newrelic_end_segment()
, and therefore thenewrelic_end_datastore_segment()
andnewrelic_end_external_segment()
functions have been removed.
- Added support for creating custom segments using the new
newrelic_start_segment()
andnewrelic_end_segment()
functions. Seelibnewrelic.h
,GUIDE.md
andexamples/ex_segment.c
for usage information.
- To increase security, TLS will now always be used in communication between the C Agent and New Relic servers. This change should be invisible to customers since the C Agent did not previously offer any way to disable TLS.
-
Added support for creating datastore segments using the new
newrelic_start_datastore_segment()
andnewrelic_end_datastore_segment()
functions. Seelibnewrelic.h
,GUIDE.md
andexamples/ex_datastore.c
for usage information. -
Added support for creating external segments using the new
newrelic_start_external_segment()
andnewrelic_end_external_segment()
functions. Seelibnewrelic.h
,GUIDE.md
andexamples/ex_external.c
for usage information. -
Added configuration options to control transaction trace generation.
- Customers may now use
newrelic_notice_error()
to record transaction errors that are not automatically handled by the agent. Errors recorded in this manner are displayed in error traces and are available to query through New Relic Insights. Seelibnewrelic.h
for usage information.
- At times, when the daemon removed an application after a 10-minute timeout, the agent daemon exited in failure. This has been fixed.
-
The function
bool newrelic_end_transaction(newrelic_txn_t** transaction)
has changed its return type from void to bool. A value of true is returned if the transaction was properly sent. An error is still logged on failure. -
The function
bool newrelic_destroy_app(newrelic_app_t** app)
has changed its return type from void to bool.
- Initial Release
- Initial Release, no bug fixes