Skip to content

Commit 17162df

Browse files
author
Christopher Frost
committed
Configurable AppDynamics application & node names
This commit makes it possible to supply values for the AppDynamics application and node names in the configuration and through service credentials. Testing and documentation also updated. [#89413382]
1 parent 623c428 commit 17162df

4 files changed

Lines changed: 50 additions & 14 deletions

File tree

config/app_dynamics_agent.yml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,4 +17,5 @@
1717
---
1818
version: 4.0.+
1919
repository_root: "{default.repository.root}/app-dynamics"
20+
default_node_name: "$(expr \"$VCAP_APPLICATION\" : \'.*instance_index[\": ]*\\([[:digit:]]*\\).*\')"
2021
default_tier_name: CloudFoundry

docs/framework-app_dynamics_agent.md

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,19 +19,25 @@ When binding AppDynamics using a user-provided service, it must have name or tag
1919
| ---- | -----------
2020
| `account-access-key` | (Optional) The account access key to use when authenticating with the controller
2121
| `account-name` | (Optional) The account name to use when authenticating with the controller
22+
| `application-name` | (Optional) the applicationa's name
2223
| `host-name` | The controller host name
24+
| `node-name` | (Optional) the application's node name
2325
| `port` | (Optional) The controller port
2426
| `ssl-enabled` | (Optional) Whether or not to use an SSL connection to the controller
2527
| `tier-name` | (Optional) the application's tier name
2628

29+
To provide more complex values such as the `tier-name`, using the interactive mode when creating a user-provided service will manage the character escaping automatically. For example, the default `tier-name` could be set with a value of `Tier-$(expr "$VCAP_APPLICATION" : '.*instance_index[": ]*\([[:digit:]]*\).*')` to calculate a value from the Cloud Foundry instance index.
30+
2731
## Configuration
2832
For general information on configuring the buildpack, refer to [Configuration and Extension][].
2933

3034
The framework can be configured by modifying the [`config/app_dynamics_agent.yml`][] file in the buildpack fork. The framework uses the [`Repository` utility support][repositories] and so it supports the [version syntax][] defined there.
3135

3236
| Name | Description
3337
| ---- | -----------
38+
| `default_application_name` | This is not provided by default but can be added to specify the application name in the AppDynamics dashboard. This can be overridden with an `application-name` entry in the credentials payload.
3439
| `default_tier_name` | The default tier name for this application in the AppDynamics dashboard. This can be overridden with a `tier-name` entry in the credentials payload.
40+
| `default_node_name` | The default node name for this application in the AppDynamics dashboard. The default value is an expression that will be evaluated based on the `instance_index` of the application. This can be overridden with a `node-name` entry in the credentials payload.
3541
| `repository_root` | The URL of the AppDynamics repository index ([details][repositories]).
3642
| `version` | The version of AppDynamics to use. Candidate versions can be found in [this listing][].
3743

lib/java_buildpack/framework/app_dynamics_agent.rb

Lines changed: 19 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -34,14 +34,11 @@ def compile
3434
def release
3535
credentials = @application.services.find_service(FILTER)['credentials']
3636
java_opts = @droplet.java_opts
37+
java_opts.add_javaagent(@droplet.sandbox + 'javaagent.jar')
3738

38-
java_opts
39-
.add_javaagent(@droplet.sandbox + 'javaagent.jar')
40-
.add_system_property('appdynamics.agent.applicationName', "'#{application_name}'")
41-
.add_system_property('appdynamics.agent.tierName', "'#{tier_name(credentials)}'")
42-
.add_system_property('appdynamics.agent.nodeName',
43-
"$(expr \"$VCAP_APPLICATION\" : '.*instance_index[\": ]*\\([[:digit:]]*\\).*')")
44-
39+
application_name(java_opts, credentials)
40+
tier_name(java_opts, credentials)
41+
node_name(java_opts, credentials)
4542
account_access_key(java_opts, credentials)
4643
account_name(java_opts, credentials)
4744
host_name(java_opts, credentials)
@@ -62,12 +59,11 @@ def supports?
6259

6360
private_constant :FILTER
6461

65-
def tier_name(credentials)
66-
credentials.key?('tier-name') ? credentials['tier-name'] : @configuration['default_tier_name']
67-
end
68-
69-
def application_name
70-
@application.details['application_name']
62+
def application_name(java_opts, credentials)
63+
name = credentials.key?('application-name') ? credentials['application-name'] :
64+
@configuration['default_application_name']
65+
name = name ? name : @application.details['application_name']
66+
java_opts.add_system_property('appdynamics.agent.applicationName', "'#{name}'")
7167
end
7268

7369
def account_access_key(java_opts, credentials)
@@ -86,6 +82,11 @@ def host_name(java_opts, credentials)
8682
java_opts.add_system_property 'appdynamics.controller.hostName', host_name
8783
end
8884

85+
def node_name(java_opts, credentials)
86+
name = credentials.key?('node-name') ? credentials['node-name'] : @configuration['default_node_name']
87+
java_opts.add_system_property('appdynamics.agent.nodeName', "#{name}")
88+
end
89+
8990
def port(java_opts, credentials)
9091
port = credentials['port']
9192
java_opts.add_system_property 'appdynamics.controller.port', port if port
@@ -96,6 +97,11 @@ def ssl_enabled(java_opts, credentials)
9697
java_opts.add_system_property 'appdynamics.controller.ssl.enabled', ssl_enabled if ssl_enabled
9798
end
9899

100+
def tier_name(java_opts, credentials)
101+
name = credentials.key?('tier-name') ? credentials['tier-name'] : @configuration['default_tier_name']
102+
java_opts.add_system_property('appdynamics.agent.tierName', "'#{name}'")
103+
end
104+
99105
end
100106

101107
end

spec/java_buildpack/framework/app_dynamics_agent_spec.rb

Lines changed: 24 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,10 @@
2121
describe JavaBuildpack::Framework::AppDynamicsAgent do
2222
include_context 'component_helper'
2323

24-
let(:configuration) { { 'default_tier_name' => 'test-tier-name' } }
24+
let(:configuration) do
25+
{ 'default_tier_name' => 'test-tier-name',
26+
'default_node_name' => "$(expr \"$VCAP_APPLICATION\" : '.*instance_index[\": ]*\\([[:digit:]]*\\).*')" }
27+
end
2528

2629
it 'does not detect without app-dynamics-n/a service' do
2730
expect(component.detect).to be_nil
@@ -77,6 +80,26 @@
7780
end
7881
end
7982

83+
context do
84+
let(:credentials) { super().merge 'application-name' => 'another-test-application-name' }
85+
86+
it 'adds application_name from credentials to JAVA_OPTS if specified' do
87+
component.release
88+
89+
expect(java_opts).to include("-Dappdynamics.agent.applicationName='another-test-application-name'")
90+
end
91+
end
92+
93+
context do
94+
let(:credentials) { super().merge 'node-name' => 'another-test-node-name' }
95+
96+
it 'adds node_name from credentials to JAVA_OPTS if specified' do
97+
component.release
98+
99+
expect(java_opts).to include('-Dappdynamics.agent.nodeName=another-test-node-name')
100+
end
101+
end
102+
80103
context do
81104
let(:credentials) { super().merge 'port' => 'test-port' }
82105

0 commit comments

Comments
 (0)