summaryrefslogtreecommitdiffstats
path: root/src/main/java/com/att/nsa/apiServer/metrics/cambria/DMaaPMetricsSender.java
blob: 371f7ccca8d77754b18ad4d6f93dba3fdfd6c39b (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
/*******************************************************************************
 *  ============LICENSE_START=======================================================
 *  org.onap.dmaap
 *  ================================================================================
 *  Copyright © 2017 AT&T Intellectual Property. All rights reserved.
 *  ================================================================================
 *  Licensed under the Apache License, Version 2.0 (the "License");
 *  you may not use this file except in compliance with the License.
 *  You may obtain a copy of the License at
 *        http://www.apache.org/licenses/LICENSE-2.0
 *  
 *  Unless required by applicable law or agreed to in writing, software
 *  distributed under the License is distributed on an "AS IS" BASIS,
 *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 *  See the License for the specific language governing permissions and
 *  limitations under the License.
 *  ============LICENSE_END=========================================================
 *
 *  ECOMP is a trademark and service mark of AT&T Intellectual Property.
 *  
 *******************************************************************************/
package com.att.nsa.apiServer.metrics.cambria;

import java.io.IOException;
import java.net.InetAddress;
import java.net.UnknownHostException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.ScheduledFuture;
import java.util.concurrent.TimeUnit;

import org.json.JSONException;
import org.json.JSONObject;
//import org.slf4j.Logger;
//import org.slf4j.LoggerFactory;

import com.att.eelf.configuration.EELFLogger;
import com.att.eelf.configuration.EELFManager;
import com.att.nsa.cambria.constants.CambriaConstants;
import com.att.nsa.cambria.metrics.publisher.CambriaPublisher;
import com.att.nsa.cambria.metrics.publisher.DMaaPCambriaClientFactory;
import com.att.nsa.drumlin.till.nv.rrNvReadable;
import com.att.nsa.metrics.CdmMetricsRegistry;
import com.att.nsa.metrics.impl.CdmConstant;

/**
 * MetricsSender will send the given metrics registry content as an event on the
 * Cambria event broker to the given topic.
 * 
 * @author author
 *
 */
public class DMaaPMetricsSender implements Runnable {
	public static final String kSetting_CambriaEnabled = "metrics.send.cambria.enabled";
	public static final String kSetting_CambriaBaseUrl = "metrics.send.cambria.baseUrl";
	public static final String kSetting_CambriaTopic = "metrics.send.cambria.topic";
	public static final String kSetting_CambriaSendFreqSecs = "metrics.send.cambria.sendEverySeconds";

	/**
	 * Schedule a periodic send of the given metrics registry using the given
	 * settings container for the Cambria location, topic, and send frequency.
	 * <br/>
	 * <br/>
	 * If the enabled flag is false, this method returns null.
	 * 
	 * @param scheduler
	 * @param metrics
	 * @param settings
	 * @param defaultTopic
	 * @return a handle to the scheduled task
	 */
	public static ScheduledFuture<?> sendPeriodically(ScheduledExecutorService scheduler, CdmMetricsRegistry metrics,
			 String defaultTopic) {
		log.info("Inside : DMaaPMetricsSender : sendPeriodically");
	String	cambriaSetting= com.att.ajsc.filemonitor.AJSCPropertiesMap.getProperty(CambriaConstants.msgRtr_prop,kSetting_CambriaEnabled);
	boolean setEnable=true;
	if (cambriaSetting!=null && cambriaSetting.equals("false") )
	setEnable= false;
		if (setEnable) {
			String Setting_CambriaBaseUrl=com.att.ajsc.filemonitor.AJSCPropertiesMap.getProperty(CambriaConstants.msgRtr_prop,kSetting_CambriaEnabled);
			
			Setting_CambriaBaseUrl=Setting_CambriaBaseUrl==null?"localhost":Setting_CambriaBaseUrl;
			
			String Setting_CambriaTopic=com.att.ajsc.filemonitor.AJSCPropertiesMap.getProperty(CambriaConstants.msgRtr_prop,kSetting_CambriaTopic);
			if(Setting_CambriaTopic==null) Setting_CambriaTopic = "msgrtr.apinode.metrics.dmaap";     
			
	//		Setting_CambriaBaseUrl=Setting_CambriaBaseUrl==null?defaultTopic:Setting_CambriaBaseUrl;
			
			String Setting_CambriaSendFreqSecs=com.att.ajsc.filemonitor.AJSCPropertiesMap.getProperty(CambriaConstants.msgRtr_prop,kSetting_CambriaSendFreqSecs);
			
			int _CambriaSendFreqSecs =30;
			if(Setting_CambriaSendFreqSecs!=null){
				 _CambriaSendFreqSecs = Integer.parseInt(Setting_CambriaSendFreqSecs);
			}
			

			return DMaaPMetricsSender.sendPeriodically(scheduler, metrics,
					Setting_CambriaBaseUrl,Setting_CambriaTopic,_CambriaSendFreqSecs
				);
			/*return DMaaPMetricsSender.sendPeriodically(scheduler, metrics,
					settings.getString(kSetting_CambriaBaseUrl, "localhost"),
					settings.getString(kSetting_CambriaTopic, defaultTopic),
					settings.getInt(kSetting_CambriaSendFreqSecs, 30));*/
		} else {
			return null;
		}
	}

	/**
	 * Schedule a periodic send of the metrics registry to the given Cambria
	 * broker and topic.
	 * 
	 * @param scheduler
	 * @param metrics
	 *            the registry to send
	 * @param cambriaBaseUrl
	 *            the base URL for Cambria
	 * @param topic
	 *            the topic to publish on
	 * @param everySeconds
	 *            how frequently to publish
	 * @return a handle to the scheduled task
	 */
	public static ScheduledFuture<?> sendPeriodically(ScheduledExecutorService scheduler, CdmMetricsRegistry metrics,
			String cambriaBaseUrl, String topic, int everySeconds) {
		return scheduler.scheduleAtFixedRate(new DMaaPMetricsSender(metrics, cambriaBaseUrl, topic), everySeconds,
				everySeconds, TimeUnit.SECONDS);
	}

	/**
	 * Create a metrics sender.
	 * 
	 * @param metrics
	 * @param cambriaBaseUrl
	 * @param topic
	 */
	public DMaaPMetricsSender(CdmMetricsRegistry metrics, String cambriaBaseUrl, String topic) {
		try {
			fMetrics = metrics;
			fHostname = InetAddress.getLocalHost().getHostName();

			// setup a "simple" publisher that will send metrics immediately
			fCambria = DMaaPCambriaClientFactory.createSimplePublisher(cambriaBaseUrl, topic);
		} catch (UnknownHostException e) {
			log.warn("Unable to get localhost address in MetricsSender constructor.", e);
			throw new IllegalArgumentException(e);
		}
	}

	/**
	 * Send on demand.
	 */
	public void send() {
		try {
			final JSONObject o = fMetrics.toJson();
			o.put("hostname", fHostname);
			o.put("now", System.currentTimeMillis());
			o.put("metricsSendTime", addTimeStamp());
			o.put("transactionEnabled", false);
			fCambria.send(fHostname, o.toString());
		} catch (JSONException e) {
			log.error("Error posting metrics to Cambria at send(): " + e);
		} catch (IOException e) {
			log.error("Error posting metrics to Cambria at send(): " + e );
		}
	}

	/**
	 * Run() calls send(). It's meant for use in a background-scheduled task.
	 */
	@Override
	public void run() {
		send();
	}

	private final CdmMetricsRegistry fMetrics;
	private final CambriaPublisher fCambria;
	private final String fHostname;

	//private static final Logger log = LoggerFactory.getLogger(MetricsSender.class);

	private static final EELFLogger log = EELFManager.getInstance().getLogger(MetricsSender.class);
	/**
	 * method creates and returnd CdmConstant object using current timestamp
	 * 
	 * @return
	 */
	public CdmConstant addTimeStamp() {
		// Add the timestamp with every metrics send
		final long metricsSendTime = System.currentTimeMillis();
		final Date d = new Date(metricsSendTime);
		final String text = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ssz").format(d);
		return new CdmConstant(metricsSendTime / 1000, "Metrics Send Time (epoch); " + text);
	}
}