-
Notifications
You must be signed in to change notification settings - Fork 159
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
[DNM] Zero-config C code to inject environment variables for Java and Node.js #3514
Conversation
…m different files for java and nodejs
instrumentation/src/main.c
Outdated
|
||
// TODO change to systemd drop in file paths | ||
static char *const env_var_file_java = "/etc/splunk/zeroconfig_java.conf"; | ||
static char *const env_var_file_node = "/etc/splunk/zeroconfig_node.conf"; |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
@jeffreyc-splunk would you have the path of the systemd drop-in env var files handy? Did you also separate them by language by any chance?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
If we go with #3506, the deb/rpm packages can include sample systemd drop-in files in /usr/lib/splunk-instrumentation/examples/systemd/
for each language (see https://github.com/signalfx/splunk-otel-collector/pull/3506/files#diff-71d510eec30ef5d3556193068fc6726c24202c439f5bd9f25989cb511ff113f9 for java). We can then add a sample splunk-otel-js.conf
once we add support for the node.js agent. These sample files can be used for manual installations.
On the other hand, I'm thinking that the installers will automatically create the actual drop-in file to be loaded by systemd, for example /usr/lib/systemd/system.conf.d/splunk-otel-auto-instrumentation.conf
, based on the installation options and defaults (see https://github.com/signalfx/splunk-otel-collector/pull/3506/files#diff-4dca014cfa3f56017a31c6a9e698de416a5bcc9cf6450a8ef9d088295f19ca98 for the test config).
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Side note: A reoccurring issue we have been noticing with being swappable with upstream auto-instrumentation solutions vs Splunk solutions is Splunk file paths are unique to Splunk vs what upstream uses. I don't think this issue should be addressed in this PR, but it is worth noting for future compatibility.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
We can make those configurable via macros. I'll do that.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Done.
instrumentation/src/main.c
Outdated
"OTEL_RESOURCE_ATTRIBUTES", | ||
"SPLUNK_PROFILER_ENABLED", | ||
"SPLUNK_PROFILER_MEMORY_ENABLED", | ||
"SPLUNK_METRICS_ENABLED", |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
this list needs to be completed. It doesn't represent the whole set yet.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
For java, would we need to support all of the splunk-specific env vars?
Any from otel java and otel sdk not included in the above list?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
yes we're missing quite a few.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Quick question for clarification: Correct me if I am wrong, wouldn't the allowed env variables be injected from the language specific drop-in files and not the constant ones defined here?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
This allows us to check the file contents, and ensure that only the keys we allow here are injected in the environment of processes.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Will this library read JAVA_TOOL_OPTIONS
and NODE_OPTIONS
from the conf files, or are you expecting them to be defined somewhere else? For systemd, we can define them directly in the drop-in file(s), but should they be added to the list for the preloader method?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
If we are allowing arbitrary input I think instrumentation checksum validation from .rodata should be required. This will add complexity and overhead but the benefit is that we'd only respect known target values.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I would just read all the env vars from a file. We can harden our stance around specific instrumentation files being placed in specific places and matching checksums.
If we go with these changes, should we just use the
The systemd config would just be something like:
And Or do we need an alternative configuration that completely excludes preloading |
That second approach would allow to run everything through the preload function, which we can test for. I'm ok with either way but I tend to the latter option because we can then format the env var file into a simple file to source from. |
Instead of the systemd drop-in method, another option could be to include and install a simple systemd environment generator script to read and inject env vars from a shared config file. This would bypass |
Co-authored-by: Jeff Cheng <83052155+jeffreyc-splunk@users.noreply.github.com>
… Node.js (#3514) * Remove sending a metric as part of auto-instrumentation (#3482) * refactor the code to inject allowed env vars * latest after pair programming * latest after review and pairing * only inject env vars for java and nodejs programs. Apply env vars from different files for java and nodejs * remove docker interactive and tty flags * wip * use arch var to set the name of the file to copy * make tests pass on arm64 * try to support arm * build for the proper platform * fix package build * review with Jason, test for env vars overrides * Make ALLOWED_ENV_VARS a single string defined through the preprocessor * Update instrumentation/tests/java/Dockerfile Co-authored-by: Jeff Cheng <83052155+jeffreyc-splunk@users.noreply.github.com> * load preload file same way as java test * move file locations to macros * use n functions to handle strings when possible --------- Co-authored-by: Jeff Cheng <83052155+jeffreyc-splunk@users.noreply.github.com>
… Node.js (#3514) * Remove sending a metric as part of auto-instrumentation (#3482) * refactor the code to inject allowed env vars * latest after pair programming * latest after review and pairing * only inject env vars for java and nodejs programs. Apply env vars from different files for java and nodejs * remove docker interactive and tty flags * wip * use arch var to set the name of the file to copy * make tests pass on arm64 * try to support arm * build for the proper platform * fix package build * review with Jason, test for env vars overrides * Make ALLOWED_ENV_VARS a single string defined through the preprocessor * Update instrumentation/tests/java/Dockerfile Co-authored-by: Jeff Cheng <83052155+jeffreyc-splunk@users.noreply.github.com> * load preload file same way as java test * move file locations to macros * use n functions to handle strings when possible --------- Co-authored-by: Jeff Cheng <83052155+jeffreyc-splunk@users.noreply.github.com>
… Node.js (#3514) * Remove sending a metric as part of auto-instrumentation (#3482) * refactor the code to inject allowed env vars * latest after pair programming * latest after review and pairing * only inject env vars for java and nodejs programs. Apply env vars from different files for java and nodejs * remove docker interactive and tty flags * wip * use arch var to set the name of the file to copy * make tests pass on arm64 * try to support arm * build for the proper platform * fix package build * review with Jason, test for env vars overrides * Make ALLOWED_ENV_VARS a single string defined through the preprocessor * Update instrumentation/tests/java/Dockerfile Co-authored-by: Jeff Cheng <83052155+jeffreyc-splunk@users.noreply.github.com> * load preload file same way as java test * move file locations to macros * use n functions to handle strings when possible --------- Co-authored-by: Jeff Cheng <83052155+jeffreyc-splunk@users.noreply.github.com>
… Node.js (#3514) * Remove sending a metric as part of auto-instrumentation (#3482) * refactor the code to inject allowed env vars * latest after pair programming * latest after review and pairing * only inject env vars for java and nodejs programs. Apply env vars from different files for java and nodejs * remove docker interactive and tty flags * wip * use arch var to set the name of the file to copy * make tests pass on arm64 * try to support arm * build for the proper platform * fix package build * review with Jason, test for env vars overrides * Make ALLOWED_ENV_VARS a single string defined through the preprocessor * Update instrumentation/tests/java/Dockerfile Co-authored-by: Jeff Cheng <83052155+jeffreyc-splunk@users.noreply.github.com> * load preload file same way as java test * move file locations to macros * use n functions to handle strings when possible --------- Co-authored-by: Jeff Cheng <83052155+jeffreyc-splunk@users.noreply.github.com>
… Node.js (#3514) * Remove sending a metric as part of auto-instrumentation (#3482) * refactor the code to inject allowed env vars * latest after pair programming * latest after review and pairing * only inject env vars for java and nodejs programs. Apply env vars from different files for java and nodejs * remove docker interactive and tty flags * wip * use arch var to set the name of the file to copy * make tests pass on arm64 * try to support arm * build for the proper platform * fix package build * review with Jason, test for env vars overrides * Make ALLOWED_ENV_VARS a single string defined through the preprocessor * Update instrumentation/tests/java/Dockerfile Co-authored-by: Jeff Cheng <83052155+jeffreyc-splunk@users.noreply.github.com> * load preload file same way as java test * move file locations to macros * use n functions to handle strings when possible --------- Co-authored-by: Jeff Cheng <83052155+jeffreyc-splunk@users.noreply.github.com>
… Node.js (#3514) * Remove sending a metric as part of auto-instrumentation (#3482) * refactor the code to inject allowed env vars * latest after pair programming * latest after review and pairing * only inject env vars for java and nodejs programs. Apply env vars from different files for java and nodejs * remove docker interactive and tty flags * wip * use arch var to set the name of the file to copy * make tests pass on arm64 * try to support arm * build for the proper platform * fix package build * review with Jason, test for env vars overrides * Make ALLOWED_ENV_VARS a single string defined through the preprocessor * Update instrumentation/tests/java/Dockerfile Co-authored-by: Jeff Cheng <83052155+jeffreyc-splunk@users.noreply.github.com> * load preload file same way as java test * move file locations to macros * use n functions to handle strings when possible --------- Co-authored-by: Jeff Cheng <83052155+jeffreyc-splunk@users.noreply.github.com>
… Node.js (#3514) * Remove sending a metric as part of auto-instrumentation (#3482) * refactor the code to inject allowed env vars * latest after pair programming * latest after review and pairing * only inject env vars for java and nodejs programs. Apply env vars from different files for java and nodejs * remove docker interactive and tty flags * wip * use arch var to set the name of the file to copy * make tests pass on arm64 * try to support arm * build for the proper platform * fix package build * review with Jason, test for env vars overrides * Make ALLOWED_ENV_VARS a single string defined through the preprocessor * Update instrumentation/tests/java/Dockerfile Co-authored-by: Jeff Cheng <83052155+jeffreyc-splunk@users.noreply.github.com> * load preload file same way as java test * move file locations to macros * use n functions to handle strings when possible --------- Co-authored-by: Jeff Cheng <83052155+jeffreyc-splunk@users.noreply.github.com>
… Node.js (#3514) * Remove sending a metric as part of auto-instrumentation (#3482) * refactor the code to inject allowed env vars * latest after pair programming * latest after review and pairing * only inject env vars for java and nodejs programs. Apply env vars from different files for java and nodejs * remove docker interactive and tty flags * wip * use arch var to set the name of the file to copy * make tests pass on arm64 * try to support arm * build for the proper platform * fix package build * review with Jason, test for env vars overrides * Make ALLOWED_ENV_VARS a single string defined through the preprocessor * Update instrumentation/tests/java/Dockerfile Co-authored-by: Jeff Cheng <83052155+jeffreyc-splunk@users.noreply.github.com> * load preload file same way as java test * move file locations to macros * use n functions to handle strings when possible --------- Co-authored-by: Jeff Cheng <83052155+jeffreyc-splunk@users.noreply.github.com>
… Node.js (#3514) * Remove sending a metric as part of auto-instrumentation (#3482) * refactor the code to inject allowed env vars * latest after pair programming * latest after review and pairing * only inject env vars for java and nodejs programs. Apply env vars from different files for java and nodejs * remove docker interactive and tty flags * wip * use arch var to set the name of the file to copy * make tests pass on arm64 * try to support arm * build for the proper platform * fix package build * review with Jason, test for env vars overrides * Make ALLOWED_ENV_VARS a single string defined through the preprocessor * Update instrumentation/tests/java/Dockerfile Co-authored-by: Jeff Cheng <83052155+jeffreyc-splunk@users.noreply.github.com> * load preload file same way as java test * move file locations to macros * use n functions to handle strings when possible --------- Co-authored-by: Jeff Cheng <83052155+jeffreyc-splunk@users.noreply.github.com>
… Node.js (#3514) * Remove sending a metric as part of auto-instrumentation (#3482) * refactor the code to inject allowed env vars * latest after pair programming * latest after review and pairing * only inject env vars for java and nodejs programs. Apply env vars from different files for java and nodejs * remove docker interactive and tty flags * wip * use arch var to set the name of the file to copy * make tests pass on arm64 * try to support arm * build for the proper platform * fix package build * review with Jason, test for env vars overrides * Make ALLOWED_ENV_VARS a single string defined through the preprocessor * Update instrumentation/tests/java/Dockerfile Co-authored-by: Jeff Cheng <83052155+jeffreyc-splunk@users.noreply.github.com> * load preload file same way as java test * move file locations to macros * use n functions to handle strings when possible --------- Co-authored-by: Jeff Cheng <83052155+jeffreyc-splunk@users.noreply.github.com>
… Node.js (#3514) * Remove sending a metric as part of auto-instrumentation (#3482) * refactor the code to inject allowed env vars * latest after pair programming * latest after review and pairing * only inject env vars for java and nodejs programs. Apply env vars from different files for java and nodejs * remove docker interactive and tty flags * wip * use arch var to set the name of the file to copy * make tests pass on arm64 * try to support arm * build for the proper platform * fix package build * review with Jason, test for env vars overrides * Make ALLOWED_ENV_VARS a single string defined through the preprocessor * Update instrumentation/tests/java/Dockerfile Co-authored-by: Jeff Cheng <83052155+jeffreyc-splunk@users.noreply.github.com> * load preload file same way as java test * move file locations to macros * use n functions to handle strings when possible --------- Co-authored-by: Jeff Cheng <83052155+jeffreyc-splunk@users.noreply.github.com>
… Node.js (#3514) * Remove sending a metric as part of auto-instrumentation (#3482) * refactor the code to inject allowed env vars * latest after pair programming * latest after review and pairing * only inject env vars for java and nodejs programs. Apply env vars from different files for java and nodejs * remove docker interactive and tty flags * wip * use arch var to set the name of the file to copy * make tests pass on arm64 * try to support arm * build for the proper platform * fix package build * review with Jason, test for env vars overrides * Make ALLOWED_ENV_VARS a single string defined through the preprocessor * Update instrumentation/tests/java/Dockerfile Co-authored-by: Jeff Cheng <83052155+jeffreyc-splunk@users.noreply.github.com> * load preload file same way as java test * move file locations to macros * use n functions to handle strings when possible --------- Co-authored-by: Jeff Cheng <83052155+jeffreyc-splunk@users.noreply.github.com>
… Node.js (#3514) * Remove sending a metric as part of auto-instrumentation (#3482) * refactor the code to inject allowed env vars * latest after pair programming * latest after review and pairing * only inject env vars for java and nodejs programs. Apply env vars from different files for java and nodejs * remove docker interactive and tty flags * wip * use arch var to set the name of the file to copy * make tests pass on arm64 * try to support arm * build for the proper platform * fix package build * review with Jason, test for env vars overrides * Make ALLOWED_ENV_VARS a single string defined through the preprocessor * Update instrumentation/tests/java/Dockerfile Co-authored-by: Jeff Cheng <83052155+jeffreyc-splunk@users.noreply.github.com> * load preload file same way as java test * move file locations to macros * use n functions to handle strings when possible --------- Co-authored-by: Jeff Cheng <83052155+jeffreyc-splunk@users.noreply.github.com>
… Node.js (#3514) * Remove sending a metric as part of auto-instrumentation (#3482) * refactor the code to inject allowed env vars * latest after pair programming * latest after review and pairing * only inject env vars for java and nodejs programs. Apply env vars from different files for java and nodejs * remove docker interactive and tty flags * wip * use arch var to set the name of the file to copy * make tests pass on arm64 * try to support arm * build for the proper platform * fix package build * review with Jason, test for env vars overrides * Make ALLOWED_ENV_VARS a single string defined through the preprocessor * Update instrumentation/tests/java/Dockerfile Co-authored-by: Jeff Cheng <83052155+jeffreyc-splunk@users.noreply.github.com> * load preload file same way as java test * move file locations to macros * use n functions to handle strings when possible --------- Co-authored-by: Jeff Cheng <83052155+jeffreyc-splunk@users.noreply.github.com>
… Node.js (#3514) * Remove sending a metric as part of auto-instrumentation (#3482) * refactor the code to inject allowed env vars * latest after pair programming * latest after review and pairing * only inject env vars for java and nodejs programs. Apply env vars from different files for java and nodejs * remove docker interactive and tty flags * wip * use arch var to set the name of the file to copy * make tests pass on arm64 * try to support arm * build for the proper platform * fix package build * review with Jason, test for env vars overrides * Make ALLOWED_ENV_VARS a single string defined through the preprocessor * Update instrumentation/tests/java/Dockerfile Co-authored-by: Jeff Cheng <83052155+jeffreyc-splunk@users.noreply.github.com> * load preload file same way as java test * move file locations to macros * use n functions to handle strings when possible --------- Co-authored-by: Jeff Cheng <83052155+jeffreyc-splunk@users.noreply.github.com>
… Node.js (#3514) * Remove sending a metric as part of auto-instrumentation (#3482) * refactor the code to inject allowed env vars * latest after pair programming * latest after review and pairing * only inject env vars for java and nodejs programs. Apply env vars from different files for java and nodejs * remove docker interactive and tty flags * wip * use arch var to set the name of the file to copy * make tests pass on arm64 * try to support arm * build for the proper platform * fix package build * review with Jason, test for env vars overrides * Make ALLOWED_ENV_VARS a single string defined through the preprocessor * Update instrumentation/tests/java/Dockerfile Co-authored-by: Jeff Cheng <83052155+jeffreyc-splunk@users.noreply.github.com> * load preload file same way as java test * move file locations to macros * use n functions to handle strings when possible --------- Co-authored-by: Jeff Cheng <83052155+jeffreyc-splunk@users.noreply.github.com>
… Node.js (#3514) * Remove sending a metric as part of auto-instrumentation (#3482) * refactor the code to inject allowed env vars * latest after pair programming * latest after review and pairing * only inject env vars for java and nodejs programs. Apply env vars from different files for java and nodejs * remove docker interactive and tty flags * wip * use arch var to set the name of the file to copy * make tests pass on arm64 * try to support arm * build for the proper platform * fix package build * review with Jason, test for env vars overrides * Make ALLOWED_ENV_VARS a single string defined through the preprocessor * Update instrumentation/tests/java/Dockerfile Co-authored-by: Jeff Cheng <83052155+jeffreyc-splunk@users.noreply.github.com> * load preload file same way as java test * move file locations to macros * use n functions to handle strings when possible --------- Co-authored-by: Jeff Cheng <83052155+jeffreyc-splunk@users.noreply.github.com>
* [DNM] Zero-config C code to inject environment variables for Java and Node.js (#3514) * Remove sending a metric as part of auto-instrumentation (#3482) * refactor the code to inject allowed env vars * latest after pair programming * latest after review and pairing * only inject env vars for java and nodejs programs. Apply env vars from different files for java and nodejs * remove docker interactive and tty flags * wip * use arch var to set the name of the file to copy * make tests pass on arm64 * try to support arm * build for the proper platform * fix package build * review with Jason, test for env vars overrides * Make ALLOWED_ENV_VARS a single string defined through the preprocessor * Update instrumentation/tests/java/Dockerfile Co-authored-by: Jeff Cheng <83052155+jeffreyc-splunk@users.noreply.github.com> * load preload file same way as java test * move file locations to macros * use n functions to handle strings when possible --------- Co-authored-by: Jeff Cheng <83052155+jeffreyc-splunk@users.noreply.github.com> * Add systemd sample file to splunk-otel-auto-instrumention (#3506) * Add systemd sample file to splunk-otel-auto-instrumention * Update manual instructions * Include default /etc/splunk/zeroconfig_java.conf in deb/rpm packages * Update tests for new libsplunk.so * Run auto instrumentation workflow for the zero-config-dev branch * Include splunk-otel-js in auto instrumentation deb/rpm (#3540) * Add systemd sample file to splunk-otel-auto-instrumention * Update tests for new libsplunk.so * Include splunk-otel-js in auto instrumentation deb/rpm * Include default /etc/splunk/zeroconfig_node.conf in deb/rpm packages * Add tests for express instrumentation (#3566) * Update installer script for systemd auto instrumentation (#3536) * Rename zeroconfig config files (#3682) * Update ZC docs and tests for manual installation/configuration (#3700) * Update docs * Update splunk-otel-js to v2.4.2 * Combine sample systemd config files * Install splunk-otel-js globally for tests * Update deps installation for node tests * Update splunk-otel-js to v2.4.4 * Update linux-manual.md * Update test for centos/oraclelinux 7 arm64 --------- Co-authored-by: Anna U <104845867+aurbiztondo-splunk@users.noreply.github.com> * Update otlp endpoint for linux installer script (#3761) * Update otlp endpoint for linux installer script * remove 0.0.0.0 * Add debian bookworm for instrumentation tests * Update CHANGELOG.md --------- Co-authored-by: Antoine Toulme <antoine@lunar-ocean.com> Co-authored-by: Anna U <104845867+aurbiztondo-splunk@users.noreply.github.com>
** Work in progress **
This PR shows the current work in progress to adopt a zero-config solution that is minimally inserting environment variables into the runtime environment of Java and Node.js processes.
Please feel free to review and help strengthen this approach.