(self, device, ip, user, password)
This function collects the metrics for one filer.
This function collects the metrics for one filer.
This function collects the metrics for one filer .
def collect(self, device, ip, user, password):
        """
        This function collects the metrics for one filer.
        """
        sys.path.append(self.config['netappsdkpath'])
        try:
            import NaServer
        except ImportError:
            self.log.error("Unable to load NetApp SDK from %s" % (
                self.config['netappsdkpath']))
            return

        # Set up the parameters
        server = NaServer.NaServer(ip, 1, 3)
        server.set_transport_type('HTTPS')
        server.set_style('LOGIN')
        server.set_admin_user(user, password)

        # We're only able to query a single object at a time,
        # so we'll loop over the objects.
        for na_object in self.METRICS.keys():

            # For easy reference later, generate a new dict for this object
            LOCALMETRICS = {}
            for metric in self.METRICS[na_object]:
                metricname, prettyname, multiplier = metric
                LOCALMETRICS[metricname] = {}
                LOCALMETRICS[metricname]["prettyname"] = prettyname
                LOCALMETRICS[metricname]["multiplier"] = multiplier

            # Keep track of how long has passed since we checked last
            CollectTime = time.time()
            time_delta = None
            if na_object in self.LastCollectTime.keys():
                time_delta = CollectTime - self.LastCollectTime[na_object]
            self.LastCollectTime[na_object] = CollectTime

            self.log.debug("Collecting metric of object %s" % na_object)
            query = NaServer.NaElement("perf-object-get-instances-iter-start")
            query.child_add_string("objectname", na_object)
            counters = NaServer.NaElement("counters")
            for metric in LOCALMETRICS.keys():
                counters.child_add_string("counter", metric)
            query.child_add(counters)

            res = server.invoke_elem(query)
            if(res.results_status() == "failed"):
                self.log.error("Connection to filer %s failed; %s" % (
                    device, res.results_reason()))
                return

            iter_tag = res.child_get_string("tag")
            num_records = 1
            max_records = 100

            # For some metrics there are dependencies between metrics for
            # a single object, so we'll need to collect all, so we can do
            # calculations later.
            raw = {}

            while(num_records != 0):
                query = NaServer.NaElement(
                    "perf-object-get-instances-iter-next")
                query.child_add_string("tag", iter_tag)
                query.child_add_string("maximum", max_records)
                res = server.invoke_elem(query)

                if(res.results_status() == "failed"):
                    print("Connection to filer %s failed; %s" % (
                        device, res.results_reason()))
                    return

                num_records = res.child_get_int("records")

                if(num_records > 0):
                    instances_list = res.child_get("instances")
                    instances = instances_list.children_get()

                    for instance in instances:
                        raw_name = unicodedata.normalize(
                            'NFKD',
                            instance.child_get_string("name")).encode(
                            'ascii', 'ignore')
                        # Shorten the name for disks as they are very long and
                        # padded with zeroes, eg:
                        # 5000C500:3A236B0B:00000000:00000000:00000000:...
                        if na_object is "disk":
                            non_zero_blocks = [
                                block for block in raw_name.split(":")
                                if block != "00000000"
                            ]
                            raw_name = "".join(non_zero_blocks)
                        instance_name = re.sub(r'\W', '_', raw_name)
                        counters_list = instance.child_get("counters")
                        counters = counters_list.children_get()

                        for counter in counters:
                            metricname = unicodedata.normalize(
                                'NFKD',
                                counter.child_get_string("name")).encode(
                                'ascii', 'ignore')
                            metricvalue = counter.child_get_string("value")
                            # We'll need a long complete pathname to not
                            # confuse self.derivative
                            pathname = ".".join([self.config["path_prefix"],
                                                 device, na_object,
                                                 instance_name, metricname])
                            raw[pathname] = int(metricvalue)

            # Do the math
            self.log.debug("Processing %i metrics for object %s" % (len(raw),
                                                                    na_object))

            # Since the derivative function both returns the derivative
            # and saves a new point, we'll need to store all derivatives
            # for local reference.
            derivative = {}
            for key in raw.keys():
                derivative[key] = self.derivative(key, raw[key])

            for key in raw.keys():
                metricname = key.split(".")[-1]
                prettyname = LOCALMETRICS[metricname]["prettyname"]
                multiplier = LOCALMETRICS[metricname]["multiplier"]

                if metricname in self.DROPMETRICS:
                    continue
                elif metricname in self.DIVIDERS.keys():
                    self._gen_delta_depend(key, derivative, multiplier,
                                           prettyname, device)
                else:
                    self._gen_delta_per_sec(key, derivative[key], time_delta,
                                            multiplier, prettyname, device)
def collect ( self , device , ip , user , password ) : sys . path . append ( self . config [ 'netappsdkpath' ] ) try : import NaServer except ImportError : self . log . error ( "Unable to load NetApp SDK from %s" % ( self . config [ 'netappsdkpath' ] ) ) return # Set up the parameters server = NaServer . NaServer ( ip , 1 , 3 ) server . set_transport_type ( 'HTTPS' ) server . set_style ( 'LOGIN' ) server . set_admin_user ( user , password ) # We're only able to query a single object at a time, # so we'll loop over the objects. for na_object in self . METRICS . keys ( ) : # For easy reference later, generate a new dict for this object LOCALMETRICS = { } for metric in self . METRICS [ na_object ] : metricname , prettyname , multiplier = metric LOCALMETRICS [ metricname ] = { } LOCALMETRICS [ metricname ] [ "prettyname" ] = prettyname LOCALMETRICS [ metricname ] [ "multiplier" ] = multiplier # Keep track of how long has passed since we checked last CollectTime = time . time ( ) time_delta = None if na_object in self . LastCollectTime . keys ( ) : time_delta = CollectTime - self . LastCollectTime [ na_object ] self . LastCollectTime [ na_object ] = CollectTime self . log . debug ( "Collecting metric of object %s" % na_object ) query = NaServer . NaElement ( "perf-object-get-instances-iter-start" ) query . child_add_string ( "objectname" , na_object ) counters = NaServer . NaElement ( "counters" ) for metric in LOCALMETRICS . keys ( ) : counters . child_add_string ( "counter" , metric ) query . child_add ( counters ) res = server . invoke_elem ( query ) if ( res . results_status ( ) == "failed" ) : self . log . error ( "Connection to filer %s failed; %s" % ( device , res . results_reason ( ) ) ) return iter_tag = res . child_get_string ( "tag" ) num_records = 1 max_records = 100 # For some metrics there are dependencies between metrics for # a single object, so we'll need to collect all, so we can do # calculations later. raw = { } while ( num_records != 0 ) : query = NaServer . NaElement ( "perf-object-get-instances-iter-next" ) query . child_add_string ( "tag" , iter_tag ) query . child_add_string ( "maximum" , max_records ) res = server . invoke_elem ( query ) if ( res . results_status ( ) == "failed" ) : print ( "Connection to filer %s failed; %s" % ( device , res . results_reason ( ) ) ) return num_records = res . child_get_int ( "records" ) if ( num_records > 0 ) : instances_list = res . child_get ( "instances" ) instances = instances_list . children_get ( ) for instance in instances : raw_name = unicodedata . normalize ( 'NFKD' , instance . child_get_string ( "name" ) ) . encode ( 'ascii' , 'ignore' ) # Shorten the name for disks as they are very long and # padded with zeroes, eg: # 5000C500:3A236B0B:00000000:00000000:00000000:... if na_object is "disk" : non_zero_blocks = [ block for block in raw_name . split ( ":" ) if block != "00000000" ] raw_name = "" . join ( non_zero_blocks ) instance_name = re . sub ( r'\W' , '_' , raw_name ) counters_list = instance . child_get ( "counters" ) counters = counters_list . children_get ( ) for counter in counters : metricname = unicodedata . normalize ( 'NFKD' , counter . child_get_string ( "name" ) ) . encode ( 'ascii' , 'ignore' ) metricvalue = counter . child_get_string ( "value" ) # We'll need a long complete pathname to not # confuse self.derivative pathname = "." . join ( [ self . config [ "path_prefix" ] , device , na_object , instance_name , metricname ] ) raw [ pathname ] = int ( metricvalue ) # Do the math self . log . debug ( "Processing %i metrics for object %s" % ( len ( raw ) , na_object ) ) # Since the derivative function both returns the derivative # and saves a new point, we'll need to store all derivatives # for local reference. derivative = { } for key in raw . keys ( ) : derivative [ key ] = self . derivative ( key , raw [ key ] ) for key in raw . keys ( ) : metricname = key . split ( "." ) [ - 1 ] prettyname = LOCALMETRICS [ metricname ] [ "prettyname" ] multiplier = LOCALMETRICS [ metricname ] [ "multiplier" ] if metricname in self . DROPMETRICS : continue elif metricname in self . DIVIDERS . keys ( ) : self . _gen_delta_depend ( key , derivative , multiplier , prettyname , device ) else : self . _gen_delta_per_sec ( key , derivative [ key ] , time_delta , multiplier , prettyname , device )