docs: def submit_metric(self, name, snmp_value, forced_type, tags=None):
          '''
          Convert the values reported as pysnmp-Managed Objects to values and
          report them to the aggregator
          '''
          tags = [] if tags is None else tags
          if reply_invalid(snmp_value):
              # Metrics not present in the queried object
              self.log.warning("No such Mib available: {}".format(name))
              return
  
          metric_name = self.normalize(name, prefix="snmp")
  
          if forced_type:
              if forced_type.lower() == "gauge":
                  value = int(snmp_value)
                  self.gauge(metric_name, value, tags)
              elif forced_type.lower() == "counter":
                  value = int(snmp_value)
                  self.rate(metric_name, value, tags)
              else:
                  self.warning("Invalid forced-type specified: {} in {}".format(forced_type, name))
                  raise Exception("Invalid forced-type in config file: {}".format(name))
  
              return
  
          # Ugly hack but couldn't find a cleaner way
          # Proper way would be to use the ASN1 method isSameTypeWith but it
          # wrongfully returns True in the case of CounterBasedGauge64
          # and Counter64 for example
          snmp_class = snmp_value.__class__.__name__
          if snmp_class in SNMP_COUNTERS:
              value = int(snmp_value)
              self.rate(metric_name, value, tags)
              return
          if snmp_class in SNMP_GAUGES:
              value = int(snmp_value)
              self.gauge(metric_name, value, tags)
              return
  
          self.log.warning("Unsupported metric type %s for %s", snmp_class, metric_name)