Skip to content
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.

Commit 27ba7b8

Browse files
author
Daniel Mikusa
authoredApr 22, 2021
Merge pull request #868 from cloudfoundry/tylerbenson-datadog-javaagent
Polishing for PR #867
2 parents 2d2634b + fc64d84 commit 27ba7b8

File tree

6 files changed

+82
-25
lines changed

6 files changed

+82
-25
lines changed
 

‎.gitignore

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,3 +5,4 @@
55
.yardoc
66
build/
77
doc
8+
.envrc

‎docs/framework-datadog_javaagent.md

Lines changed: 13 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,18 +1,23 @@
11
# Datadog APM Javaagent Framework
2-
The [Datadog APM]() Javaagent Framework allows your application to be dynamically instrumented [by][datadog-javaagent] `dd-java-agent.jar`.
2+
The [Datadog APM]() Javaagent Framework installs an agent that allows your application to be dynamically instrumented [by][datadog-javaagent] `dd-java-agent.jar`.
3+
4+
For this functionality to work, you **must** also use this feature in combination with the [Datadog Cloudfoundry Buildpack](). The Datadog Cloudfoundry Buildpack **must** run first, so that it can supply the components to which the Datadog APM agent will talk. Please make sure you follow the instructions on the README for the Datadog Cloudfoundry Buildpack to enable and configure it.
5+
6+
The framework will configure the Datadog agent for correct use in most situations, however you may adjust its behavior by setting additional environment variables. For a complete list of Datadog Agent configuration options, please see the [Datadog Documentation](https://docs.datadoghq.com/tracing/setup_overview/setup/java/?tab=containers#configuration).
37

48
<table>
59
<tr>
6-
<td><strong>Detection Criterion</strong></td><td>One of the following environment variables configured:
7-
<ul>
8-
<li><code>DD_APM_ENABLED</code> configured as <code>true</code></li>
9-
<li><code>DD_API_KEY</code> defined with the assumption of a <a href='https://github.com/DataDog/datadog-cloudfoundry-buildpack'>datadog-cloudfoundry-buildpack</a> configured, and <code>DD_APM_ENABLED</code> not <code>false</code></li>
10-
</ul>
10+
<td><strong>Detection Criterion</strong></td><td>All must be true:
11+
<ul>
12+
<li>The Datadog Buildpack must be included</li>
13+
<li><code>DD_API_KEY</code> defined and contain your API key</li>
14+
</ul>
15+
Optionally, you may set <code>DD_APM_ENABLED</code> to <code>false</code> to force the framework to not contribute the agent.
1116
</td>
1217
</tr>
1318
<tr>
1419
<td><strong>Tags</strong></td>
15-
<td><tt>datadog-javaagent=&lt;version&gt;</tt></td>
20+
<td><code>datadog-javaagent=&lt;version&gt;</code></td>
1621
</tr>
1722
</table>
1823

@@ -33,6 +38,7 @@ The javaagent can be configured directly via environment variables or system pro
3338

3439
[Configuration and Extension]: ../README.md#configuration-and-extension
3540
[Datadog APM]: https://www.datadoghq.com/product/apm/
41+
[Datadog Cloudfoundry Builpack]: https://github.com/DataDog/datadog-cloudfoundry-buildpack
3642
[datadog-javaagent]: https://github.com/datadog/dd-trace-java
3743
[Configuration of Datadog Javaagent]: https://docs.datadoghq.com/tracing/setup_overview/setup/java/#configuration
3844
[this listing]: https://raw.githubusercontent.com/datadog/dd-trace-java/cloudfoundry/index.yml

‎lib/java_buildpack/framework/datadog_javaagent.rb

Lines changed: 20 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -25,23 +25,35 @@ module Framework
2525
class DatadogJavaagent < JavaBuildpack::Component::VersionedDependencyComponent
2626
include JavaBuildpack::Util
2727

28+
def initialize(context)
29+
super(context)
30+
@datadog_buildpack = File.exist? File.join(@droplet.root, 'datadog')
31+
@logger = JavaBuildpack::Logging::LoggerFactory.instance.get_logger DatadogJavaagent
32+
end
33+
2834
# (see JavaBuildpack::Component::BaseComponent#compile)
2935
def compile
30-
download_jar
36+
@logger.error 'Datadog Buildpack is required, but not found' unless @datadog_buildpack
37+
38+
download_jar if @datadog_buildpack
3139
end
3240

3341
# (see JavaBuildpack::Component::BaseComponent#release)
3442
def release
35-
java_opts = @droplet.java_opts
43+
return unless @datadog_buildpack
44+
45+
java_opts = @droplet.java_opts
3646
java_opts.add_javaagent(@droplet.sandbox + jar_name)
3747

38-
if !@application.environment.key?('DD_SERVICE')
39-
java_opts.add_system_property('dd.service', @application.details['application_name'])
48+
unless @application.environment.key?('DD_SERVICE')
49+
app_name = @configuration['default_application_name'] || @application.details['application_name']
50+
java_opts.add_system_property('dd.service', "\\\"#{app_name}\\\"")
4051
end
4152

42-
if @application.details['application_version']
43-
java_opts.add_system_property('dd.version', @application.details['application_version'])
44-
end
53+
return unless @application.details['application_version']
54+
55+
version = @configuration['default_application_version'] || @application.details['application_version']
56+
java_opts.add_system_property('dd.version', version)
4557
end
4658

4759
protected
@@ -50,8 +62,7 @@ def release
5062
def supports?
5163
api_key_defined = @application.environment.key?('DD_API_KEY') && !@application.environment['DD_API_KEY'].empty?
5264
apm_disabled = @application.environment['DD_APM_ENABLED'] == 'false'
53-
apm_enabled = @application.environment['DD_APM_ENABLED'] == 'true'
54-
(api_key_defined && !apm_disabled) || apm_enabled
65+
(api_key_defined && !apm_disabled)
5566
end
5667
end
5768
end
1.26 KB
Binary file not shown.

‎spec/java_buildpack/framework/datadog_javaagent_spec.rb

Lines changed: 47 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,11 @@
2323
describe JavaBuildpack::Framework::DatadogJavaagent do
2424
include_context 'with component help'
2525

26+
let(:configuration) do
27+
{ 'default_application_version' => nil,
28+
'default_application_name' => nil }
29+
end
30+
2631
describe '#detect' do
2732
subject(:detect) { component.detect }
2833

@@ -45,7 +50,7 @@
4550
context 'when apm is enabled with no api key' do
4651
let(:environment) { { 'DD_APM_ENABLED' => 'true' } }
4752

48-
it { is_expected.to eq("datadog-javaagent=#{version}") }
53+
it { is_expected.to be nil }
4954
end
5055

5156
context 'when apm key is provided' do
@@ -56,16 +61,50 @@
5661
end
5762

5863
context 'when apm key is provided' do
59-
let(:environment) { { 'DD_API_KEY' => 'foo' } }
64+
let(:environment) do
65+
super().update({ 'DD_API_KEY' => 'foo' })
66+
end
6067

61-
it 'compile downloads datadog-javaagent JAR', cache_fixture: 'stub-datadog-javaagent.jar' do
62-
component.compile
63-
expect(sandbox + "datadog-javaagent-#{version}.jar").to exist
68+
context 'when datadog buildpack is present' do
69+
before do
70+
FileUtils.mkdir_p File.join(context[:droplet].root, 'datadog')
71+
end
72+
73+
after do
74+
FileUtils.rmdir File.join(context[:droplet].root, 'datadog')
75+
end
76+
77+
it 'compile downloads datadog-javaagent JAR', cache_fixture: 'stub-datadog-javaagent.jar' do
78+
component.compile
79+
expect(sandbox + "datadog_javaagent-#{version}.jar").to exist
80+
end
81+
82+
it 'release updates JAVA_OPTS' do
83+
component.release
84+
85+
expect(java_opts).to include(
86+
"-javaagent:$PWD/.java-buildpack/datadog_javaagent/datadog_javaagent-#{version}.jar"
87+
)
88+
expect(java_opts).to include('-Ddd.service=\"test-application-name\"')
89+
expect(java_opts).to include('-Ddd.version=test-application-version')
90+
end
6491
end
6592

66-
it 'release updates JAVA_OPTS' do
67-
component.release
68-
expect(java_opts).to include("-javaagent:$PWD/.java-buildpack/datadog_javaagent/datadog_javaagent-#{version}.jar")
93+
context 'when datadog buildpack is not present' do
94+
it 'compile downloads datadog-javaagent JAR', cache_fixture: 'stub-datadog-javaagent.jar' do
95+
component.compile
96+
expect(sandbox + "datadog_javaagent-#{version}.jar").not_to exist
97+
end
98+
99+
it 'release updates JAVA_OPTS' do
100+
component.release
101+
102+
expect(java_opts).not_to include(
103+
"-javaagent:$PWD/.java-buildpack/datadog_javaagent/datadog_javaagent-#{version}.jar"
104+
)
105+
expect(java_opts).not_to include('-Ddd.service=\"test-application-name\"')
106+
expect(java_opts).not_to include('-Ddd.version=test-application-version')
107+
end
69108
end
70109
end
71110
end

‎spec/java_buildpack/util/configuration_utils_spec.rb

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -115,7 +115,7 @@
115115
context do
116116

117117
let(:environment) do
118-
{ 'JBP_CONFIG_TEST' => '{version:1.8.+}' }
118+
{ 'JBP_CONFIG_TEST' => '{version: 1.8.+' }
119119
end
120120

121121
it 'diagnoses invalid YAML syntax' do

0 commit comments

Comments
 (0)