1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21 package goldengate.ftp.exec.snmp;
22
23 import org.jboss.netty.handler.traffic.TrafficCounter;
24
25 import goldengate.common.command.ReplyCode;
26 import goldengate.common.database.DbPreparedStatement;
27 import goldengate.common.database.DbSession;
28 import goldengate.common.database.data.AbstractDbData.UpdatedInfo;
29 import goldengate.common.database.exception.GoldenGateDatabaseException;
30 import goldengate.common.database.exception.GoldenGateDatabaseNoConnectionException;
31 import goldengate.common.database.exception.GoldenGateDatabaseSqlException;
32 import goldengate.common.logging.GgInternalLogger;
33 import goldengate.common.logging.GgInternalLoggerFactory;
34 import goldengate.ftp.exec.config.FileBasedConfiguration;
35 import goldengate.ftp.exec.database.DbConstant;
36 import goldengate.ftp.exec.database.data.DbTransferLog;
37 import goldengate.ftp.exec.snmp.FtpPrivateMib.MibLevel;
38 import goldengate.ftp.exec.snmp.FtpPrivateMib.goldenGateDetailedValuesIndex;
39 import goldengate.ftp.exec.snmp.FtpPrivateMib.goldenGateErrorValuesIndex;
40 import goldengate.ftp.exec.snmp.FtpPrivateMib.goldenGateGlobalValuesIndex;
41 import goldengate.snmp.GgSnmpAgent;
42 import goldengate.snmp.interf.GgInterfaceMonitor;
43
44
45
46
47
48
49
50 public class FtpMonitoring implements GgInterfaceMonitor {
51
52
53
54 private static GgInternalLogger logger = GgInternalLoggerFactory
55 .getLogger(FtpMonitoring.class);
56
57 public GgSnmpAgent agent;
58
59
60 public long nbNetworkConnection = 0;
61 public long secondsRunning = 0;
62 public long nbThread = 0;
63 public long bandwidthIn = 0;
64 public long bandwidthOut = 0;
65
66
67 private DbSession dbSession = null;
68 private TrafficCounter trafficCounter =
69 FileBasedConfiguration.fileBasedConfiguration.
70 getFtpInternalConfiguration().getGlobalTrafficShapingHandler().getTrafficCounter();
71
72 public long nbCountInfoUnknown = 0;
73 public long nbCountInfoNotUpdated = 0;
74 public long nbCountInfoInterrupted = 0;
75 public long nbCountInfoToSubmit = 0;
76 public long nbCountInfoError = 0;
77 public long nbCountInfoRunning = 0;
78 public long nbCountInfoDone = 0;
79
80 public long nbInActiveTransfer = 0;
81 public long nbOutActiveTransfer = 0;
82 public long lastInActiveTransfer = System.currentTimeMillis();
83 public long lastOutActiveTransfer = System.currentTimeMillis();
84 public long nbInTotalTransfer = 0;
85 public long nbOutTotalTransfer = 0;
86 public long nbInErrorTransfer = 0;
87 public long nbOutErrorTransfer = 0;
88
89 public long nbCountAllTransfer = 0;
90
91
92 private long []reply_info_notransfers = new long[goldenGateDetailedValuesIndex.reply_350.ordinal()+1];
93
94 private long []reply_error_notransfers = new long[goldenGateErrorValuesIndex.reply_553.ordinal()+1];
95 {
96 for (int i = 0; i <= goldenGateDetailedValuesIndex.reply_350.ordinal(); i++) {
97 reply_info_notransfers[i] = 0;
98 }
99 for (int i = 0; i <= goldenGateErrorValuesIndex.reply_553.ordinal(); i++) {
100 reply_error_notransfers[i] = 0;
101 }
102 }
103
104 private DbPreparedStatement countInfo = null;
105
106
107 private DbPreparedStatement countInActiveTransfer = null;
108 private DbPreparedStatement countOutActiveTransfer = null;
109 private DbPreparedStatement countInTotalTransfer = null;
110 private DbPreparedStatement countOutTotalTransfer = null;
111 private DbPreparedStatement countInErrorTransfer = null;
112 private DbPreparedStatement countOutErrorTransfer = null;
113 private DbPreparedStatement countAllTransfer = null;
114
115 private DbPreparedStatement countStatus = null;
116
117
118
119
120
121 public FtpMonitoring(DbSession session) {
122 if (session != null) {
123 dbSession = session;
124 } else {
125 dbSession = DbConstant.admin.session;
126 }
127 this.initialize();
128 }
129
130
131
132
133 @Override
134 public void setAgent(GgSnmpAgent agent) {
135 this.agent = agent;
136 this.lastInActiveTransfer = this.agent.getUptimeSystemTime();
137 this.lastOutActiveTransfer= this.agent.getUptimeSystemTime();
138 }
139
140
141
142
143 @Override
144 public void initialize() {
145 logger.debug("Initialize monitoring");
146 try {
147
148 countInfo = DbTransferLog.getCountInfoPrepareStatement(dbSession);
149
150 countInActiveTransfer = DbTransferLog.getCountInOutRunningPrepareStatement(dbSession, true, true);
151 countOutActiveTransfer = DbTransferLog.getCountInOutRunningPrepareStatement(dbSession, false, true);
152 countInTotalTransfer = DbTransferLog.getCountInOutRunningPrepareStatement(dbSession, true, false);
153 countOutTotalTransfer = DbTransferLog.getCountInOutRunningPrepareStatement(dbSession, false, false);
154
155 countInErrorTransfer = DbTransferLog.getCountInOutErrorPrepareStatement(dbSession, true);
156 countOutErrorTransfer = DbTransferLog.getCountInOutErrorPrepareStatement(dbSession, false);
157
158 countAllTransfer = DbTransferLog.getCountAllPrepareStatement(dbSession);
159
160 countStatus = DbTransferLog.getCountStatusPrepareStatement(dbSession);
161 } catch (GoldenGateDatabaseException e) {
162 }
163 }
164
165
166
167
168 @Override
169 public void releaseResources() {
170 try {
171 logger.debug("Release monitoring");
172
173 countInfo.realClose();
174
175 countInActiveTransfer.realClose();
176 countOutActiveTransfer.realClose();
177 countInTotalTransfer.realClose();
178 countOutTotalTransfer.realClose();
179 countInErrorTransfer.realClose();
180 countOutErrorTransfer.realClose();
181
182 countAllTransfer.realClose();
183
184 countStatus.realClose();
185 } catch (NullPointerException e) {
186 }
187 }
188 private static final int ref421 =
189 ReplyCode.REPLY_421_SERVICE_NOT_AVAILABLE_CLOSING_CONTROL_CONNECTION.ordinal();
190
191
192
193
194 public void updateCodeNoTransfer(ReplyCode code) {
195 int i = code.ordinal();
196 if (i >= ref421) {
197 i -= ref421;
198 reply_error_notransfers[i]++;
199 } else {
200 reply_info_notransfers[i]++;
201 }
202 }
203
204
205
206 public void updateLastInBound() {
207 lastInActiveTransfer = System.currentTimeMillis();
208 }
209
210
211
212 public void updateLastOutBand() {
213 lastOutActiveTransfer = System.currentTimeMillis();
214 }
215
216
217
218
219
220 public void run(int type, int entry) {
221 long nbMs = FileBasedConfiguration.fileBasedConfiguration.agentSnmp.getUptime()+100;
222 MibLevel level = MibLevel.values()[type];
223 switch (level) {
224 case globalInfo:
225 if (((FtpPrivateMib) this.agent.mib).rowGlobal != null)
226 run(nbMs, goldenGateGlobalValuesIndex.values()[entry]);
227 return;
228 case detailedInfo:
229 if (((FtpPrivateMib) this.agent.mib).rowDetailed != null)
230 run(nbMs, goldenGateDetailedValuesIndex.values()[entry]);
231 return;
232 case errorInfo:
233 if (((FtpPrivateMib) this.agent.mib).rowError != null)
234 run(nbMs, goldenGateErrorValuesIndex.values()[entry]);
235 return;
236 }
237 }
238
239
240
241
242
243 protected void updateGlobalValue(int rank, long value) {
244 ((FtpPrivateMib) this.agent.mib).rowGlobal.setValue(rank, value);
245 }
246
247
248
249
250
251 protected void updateDetailedValue(int rank, long value) {
252 ((FtpPrivateMib) this.agent.mib).rowDetailed.setValue(rank, value);
253 }
254
255
256
257
258
259 protected void updateErrorValue(int rank, long value) {
260 ((FtpPrivateMib) this.agent.mib).rowError.setValue(rank, value);
261 }
262
263
264
265
266
267 protected void run(long nbMs, goldenGateGlobalValuesIndex entry) {
268 synchronized (trafficCounter) {
269 long val = 0;
270 long limitDate = System.currentTimeMillis()-nbMs;
271
272 try {
273 switch (entry) {
274 case applUptime:
275 return;
276 case applOperStatus:
277 return;
278 case applLastChange:
279 return;
280 case applInboundAssociations:
281 DbTransferLog.finishSelectOrCountPrepareStatement(countInActiveTransfer, limitDate);
282 nbInActiveTransfer = DbTransferLog.getResultCountPrepareStatement(countInActiveTransfer);
283 updateGlobalValue(entry.ordinal(), nbInActiveTransfer);
284 return;
285 case applOutboundAssociations:
286 DbTransferLog.finishSelectOrCountPrepareStatement(countOutActiveTransfer, limitDate);
287 nbOutActiveTransfer = DbTransferLog.getResultCountPrepareStatement(countOutActiveTransfer);
288 updateGlobalValue(entry.ordinal(), nbOutActiveTransfer);
289 return;
290 case applAccumInboundAssociations:
291 DbTransferLog.finishSelectOrCountPrepareStatement(countInTotalTransfer, limitDate);
292 nbInTotalTransfer = DbTransferLog.getResultCountPrepareStatement(countInTotalTransfer);
293 updateGlobalValue(entry.ordinal(), nbInTotalTransfer);
294 return;
295 case applAccumOutboundAssociations:
296 DbTransferLog.finishSelectOrCountPrepareStatement(countOutTotalTransfer, limitDate);
297 nbOutTotalTransfer = DbTransferLog.getResultCountPrepareStatement(countOutTotalTransfer);
298 updateGlobalValue(entry.ordinal(), nbOutTotalTransfer);
299 return;
300 case applLastInboundActivity:
301 val = (lastInActiveTransfer-
302 this.agent.getUptimeSystemTime())/10;
303 if (val < 0)
304 val = 0;
305 updateGlobalValue(entry.ordinal(), val);
306 return;
307 case applLastOutboundActivity:
308 val = (lastOutActiveTransfer-
309 this.agent.getUptimeSystemTime())/10;
310 if (val < 0)
311 val = 0;
312 updateGlobalValue(entry.ordinal(), val);
313 return;
314 case applRejectedInboundAssociations:
315 DbTransferLog.finishSelectOrCountPrepareStatement(countInErrorTransfer, limitDate);
316 nbInErrorTransfer = DbTransferLog.getResultCountPrepareStatement(countInErrorTransfer);
317 updateGlobalValue(entry.ordinal(), nbInErrorTransfer);
318 return;
319 case applFailedOutboundAssociations:
320 DbTransferLog.finishSelectOrCountPrepareStatement(countOutErrorTransfer, limitDate);
321 nbOutErrorTransfer = DbTransferLog.getResultCountPrepareStatement(countOutErrorTransfer);
322 updateGlobalValue(entry.ordinal(), nbOutErrorTransfer);
323 return;
324 case applInboundBandwidthKBS:
325 val = trafficCounter.getLastReadThroughput()>>10;
326 updateGlobalValue(entry.ordinal(), val);
327 return;
328 case applOutboundBandwidthKBS:
329 val = trafficCounter.getLastWriteThroughput()>>10;
330 updateGlobalValue(entry.ordinal(), val);
331 return;
332 case nbInfoUnknown:
333 nbCountInfoUnknown = DbTransferLog.getResultCountPrepareStatement(countInfo,
334 UpdatedInfo.UNKNOWN, limitDate);
335 updateGlobalValue(entry.ordinal(), nbCountInfoUnknown);
336 return;
337 case nbInfoNotUpdated:
338 nbCountInfoNotUpdated = DbTransferLog.getResultCountPrepareStatement(countInfo,
339 UpdatedInfo.NOTUPDATED, limitDate);
340 updateGlobalValue(entry.ordinal(), nbCountInfoNotUpdated);
341 return;
342 case nbInfoInterrupted:
343 nbCountInfoInterrupted = DbTransferLog.getResultCountPrepareStatement(countInfo,
344 UpdatedInfo.INTERRUPTED, limitDate);
345 updateGlobalValue(entry.ordinal(), nbCountInfoInterrupted);
346 return;
347 case nbInfoToSubmit:
348 nbCountInfoToSubmit = DbTransferLog.getResultCountPrepareStatement(countInfo,
349 UpdatedInfo.TOSUBMIT, limitDate);
350 updateGlobalValue(entry.ordinal(), nbCountInfoToSubmit);
351 return;
352 case nbInfoError:
353 nbCountInfoError = DbTransferLog.getResultCountPrepareStatement(countInfo,
354 UpdatedInfo.INERROR, limitDate);
355 updateGlobalValue(entry.ordinal(), nbCountInfoError);
356 return;
357 case nbInfoRunning:
358 nbCountInfoRunning = DbTransferLog.getResultCountPrepareStatement(countInfo,
359 UpdatedInfo.RUNNING, limitDate);
360 updateGlobalValue(entry.ordinal(), nbCountInfoRunning);
361 return;
362 case nbInfoDone:
363 nbCountInfoDone = DbTransferLog.getResultCountPrepareStatement(countInfo,
364 UpdatedInfo.DONE, limitDate);
365 updateGlobalValue(entry.ordinal(), nbCountInfoDone);
366 return;
367 case nbAllTransfer:
368 DbTransferLog.finishSelectOrCountPrepareStatement(countAllTransfer, limitDate);
369 nbCountAllTransfer = DbTransferLog.getResultCountPrepareStatement(countAllTransfer);
370 updateGlobalValue(entry.ordinal(), nbCountAllTransfer);
371 return;
372 case memoryTotal:
373 return;
374 case memoryFree:
375 return;
376 case memoryUsed:
377 return;
378 case nbThreads:
379 nbThread = Thread.activeCount();
380 updateGlobalValue(entry.ordinal(), nbThread);
381 return;
382 case nbNetworkConnection:
383 nbNetworkConnection = FileBasedConfiguration.fileBasedConfiguration.getFtpInternalConfiguration().getNumberSessions();
384 updateGlobalValue(entry.ordinal(), nbNetworkConnection);
385 return;
386 }
387 } catch (GoldenGateDatabaseNoConnectionException e) {
388 } catch (GoldenGateDatabaseSqlException e) {
389 }
390 }
391 }
392
393
394
395
396
397 protected void run(long nbMs, goldenGateDetailedValuesIndex entry) {
398 synchronized (trafficCounter) {
399 long limitDate = System.currentTimeMillis()-nbMs;
400
401 long value = DbTransferLog.getResultCountPrepareStatement(
402 countStatus, entry.code, limitDate);
403 updateDetailedValue(entry.ordinal(), value+reply_info_notransfers[entry.ordinal()]);
404 }
405 }
406
407
408
409
410
411 protected void run(long nbMs, goldenGateErrorValuesIndex entry) {
412 synchronized (trafficCounter) {
413 long limitDate = System.currentTimeMillis()-nbMs;
414
415 long value = DbTransferLog.getResultCountPrepareStatement(
416 countStatus, entry.code, limitDate);
417 updateErrorValue(entry.ordinal(), value+reply_error_notransfers[entry.ordinal()]);
418 }
419 }
420
421 }