View Javadoc

1   /**
2      This file is part of GoldenGate Project (named also GoldenGate or GG).
3   
4      Copyright 2009, Frederic Bregier, and individual contributors by the @author
5      tags. See the COPYRIGHT.txt in the distribution for a full listing of
6      individual contributors.
7   
8      All GoldenGate Project is free software: you can redistribute it and/or 
9      modify it under the terms of the GNU General Public License as published 
10     by the Free Software Foundation, either version 3 of the License, or
11     (at your option) any later version.
12  
13     GoldenGate is distributed in the hope that it will be useful,
14     but WITHOUT ANY WARRANTY; without even the implied warranty of
15     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
16     GNU General Public License for more details.
17  
18     You should have received a copy of the GNU General Public License
19     along with GoldenGate .  If not, see <http://www.gnu.org/licenses/>.
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   * SNMP Monitoring class for FTP Exec
46   * 
47   * @author Frederic Bregier
48   *
49   */
50  public class FtpMonitoring implements GgInterfaceMonitor {
51      /**
52       * Internal Logger
53       */
54      private static GgInternalLogger logger = GgInternalLoggerFactory
55              .getLogger(FtpMonitoring.class);
56  
57      public GgSnmpAgent agent;
58  
59      // global informations
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      // Internal data
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      // Info for other reasons than transfers
92      private long []reply_info_notransfers = new long[goldenGateDetailedValuesIndex.reply_350.ordinal()+1];
93      // Error for other reasons than transfers
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     // Overall status including past, future and current transfers
104     private DbPreparedStatement countInfo = null;
105 
106     // Current situation of all transfers, running or not
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     // Error Status on all transfers
115     private DbPreparedStatement countStatus = null;
116 
117     /**
118      * 
119      * @param session
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     /* (non-Javadoc)
131      * @see goldengate.snmp.interf.GgInterfaceMonitor#setAgent(goldengate.snmp.GgSnmpAgent)
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     /* (non-Javadoc)
141      * @see goldengate.snmp.interf.GgInterfaceMonitor#initialize()
142      */
143     @Override
144     public void initialize() {
145         logger.debug("Initialize monitoring");
146         try {
147             // Overall status including past, future and current transfers
148             countInfo = DbTransferLog.getCountInfoPrepareStatement(dbSession);
149             // Count of Active/All In/Out transfers
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             // All
158             countAllTransfer = DbTransferLog.getCountAllPrepareStatement(dbSession);
159             // Error Status on all transfers
160             countStatus = DbTransferLog.getCountStatusPrepareStatement(dbSession);
161         } catch (GoldenGateDatabaseException e) {
162         }
163     }
164 
165     /* (non-Javadoc)
166      * @see goldengate.snmp.interf.GgInterfaceMonitor#releaseResources()
167      */
168     @Override
169     public void releaseResources() {
170         try {
171             logger.debug("Release monitoring");
172             // Overall status including past, future and current transfers
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             // Error Status on all transfers
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      * Update the reply code counter for other operations than a transfer
192      * @param code
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      * Update the last InBound connection time
205      */
206     public void updateLastInBound() {
207         lastInActiveTransfer = System.currentTimeMillis();
208     }
209     /**
210      * Update the last OutBound connection time
211      */
212     public void updateLastOutBand() {
213         lastOutActiveTransfer = System.currentTimeMillis();
214     }
215     /**
216      * Update the value for one particular MIB entry
217      * @param type
218      * @param entry
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:// Global
225                 if (((FtpPrivateMib) this.agent.mib).rowGlobal != null)
226                     run(nbMs, goldenGateGlobalValuesIndex.values()[entry]);
227                 return;
228             case detailedInfo:// Detailed
229                 if (((FtpPrivateMib) this.agent.mib).rowDetailed != null)
230                     run(nbMs, goldenGateDetailedValuesIndex.values()[entry]);
231                 return;
232             case errorInfo:// Error
233                 if (((FtpPrivateMib) this.agent.mib).rowError != null)
234                     run(nbMs, goldenGateErrorValuesIndex.values()[entry]);
235                 return;
236         }
237     }
238     /**
239      * Update a value in Global MIB part 
240      * @param rank
241      * @param value
242      */
243     protected void updateGlobalValue(int rank, long value) {
244         ((FtpPrivateMib) this.agent.mib).rowGlobal.setValue(rank, value);
245     }
246     /**
247      * Update a value in Detailed MIB part
248      * @param rank
249      * @param value
250      */
251     protected void updateDetailedValue(int rank, long value) {
252         ((FtpPrivateMib) this.agent.mib).rowDetailed.setValue(rank, value);
253     }
254     /**
255      * Update a value in Error MIB part
256      * @param rank
257      * @param value
258      */
259     protected void updateErrorValue(int rank, long value) {
260         ((FtpPrivateMib) this.agent.mib).rowError.setValue(rank, value);
261     }
262     /**
263      * Update a value in Global MIB part
264      * @param nbMs
265      * @param entry
266      */
267     protected void run(long nbMs, goldenGateGlobalValuesIndex entry) {
268         synchronized (trafficCounter) {
269             long val = 0;
270             long limitDate = System.currentTimeMillis()-nbMs;
271             //Global
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;// B/s -> KB/s
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      * Update a value in Detailed MIB part
394      * @param nbMs
395      * @param entry
396      */
397     protected void run(long nbMs, goldenGateDetailedValuesIndex entry) {
398         synchronized (trafficCounter) {
399             long limitDate = System.currentTimeMillis()-nbMs;
400             //Detailed
401             long value = DbTransferLog.getResultCountPrepareStatement(
402                     countStatus, entry.code, limitDate);
403             updateDetailedValue(entry.ordinal(), value+reply_info_notransfers[entry.ordinal()]);
404         }
405     }
406     /**
407      * Update a value in Error MIB part
408      * @param nbMs
409      * @param entry
410      */
411     protected void run(long nbMs, goldenGateErrorValuesIndex entry) {
412         synchronized (trafficCounter) {
413             long limitDate = System.currentTimeMillis()-nbMs;
414             //Error
415             long value = DbTransferLog.getResultCountPrepareStatement(
416                     countStatus, entry.code, limitDate);
417             updateErrorValue(entry.ordinal(), value+reply_error_notransfers[entry.ordinal()]);
418         }
419     }
420 
421 }