content: /**
   * Licensed to the Apache Software Foundation (ASF) under one
   * or more contributor license agreements.  See the NOTICE file
   * distributed with this work for additional information
   * regarding copyright ownership.  The ASF licenses this file
   * to you 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.
   */
  package com.alibaba.jstorm.common.metric;
  
  import com.alibaba.jstorm.metric.KVSerializable;
  import com.alibaba.jstorm.metric.MetaType;
  import com.alibaba.jstorm.metric.MetricType;
  import com.alibaba.jstorm.metric.MetricUtils;
  import com.alibaba.jstorm.utils.JStormUtils;
  
  import java.util.Date;
  
  /**
   * @author wange
   * @since 15/6/18
   */
  public class MetricMeta implements KVSerializable {
      // common
      private long id;
      // string id
      private String sid;
      private String clusterName;
      private String topologyId;
      private int metricType;
      private String metricGroup = MetricUtils.DEFAULT_GROUP;//sys group
      private String metricName;
      private Date gmtCreate = new Date();
  
      // task meta
      private String component = MetricUtils.EMPTY;
      private int taskId = 0;
      private String streamId = MetricUtils.EMPTY;
      private int metaType;
  
      // worker meta
      private String host = MetricUtils.EMPTY;
      private int port = 0;
  
      public long getId() {
          return id;
      }
  
      public void setId(long id) {
          this.id = id;
          this.sid = id + "";
      }
  
      public String getSid() {
          return sid;
      }
  
      public void setSid(String sid) {
          this.sid = sid;
      }
  
      public String getClusterName() {
          return clusterName;
      }
  
      public void setClusterName(String clusterName) {
          this.clusterName = clusterName;
      }
  
      public String getTopologyId() {
          return topologyId;
      }
  
      public void setTopologyId(String topologyId) {
          this.topologyId = topologyId;
      }
  
      public String getHost() {
          return host;
      }
  
      public void setHost(String host) {
          this.host = host;
      }
  
      public int getPort() {
          return port;
      }
  
      public void setPort(int port) {
          this.port = port;
      }
  
      public int getMetricType() {
          return metricType;
      }
  
      public void setMetricType(int metricType) {
          this.metricType = metricType;
      }
  
      public String getMetricGroup() {
          return metricGroup;
      }
  
      public void setMetricGroup(String metricGroup) {
          this.metricGroup = metricGroup;
      }
  
      public String getMetricName() {
          return metricName;
      }
  
      public void setMetricName(String metricName) {
          this.metricName = metricName;
      }
  
      public Date getGmtCreate() {
          return gmtCreate;
      }
  
      public void setGmtCreate(Date gmtCreate) {
          this.gmtCreate = gmtCreate;
      }
  
      public String getComponent() {
          return component;
      }
  
      public void setComponent(String component) {
          this.component = component;
      }
  
      public int getTaskId() {
          return taskId;
      }
  
      public void setTaskId(int taskId) {
          this.taskId = taskId;
      }
  
      public String getStreamId() {
          return streamId;
      }
  
      public void setStreamId(String streamId) {
          this.streamId = streamId;
      }
  
      public int getMetaType() {
          return metaType;
      }
  
      public void setMetaType(int metaType) {
          this.metaType = metaType;
      }
  
      public boolean isWorkerMetric() {
          return this.metaType == MetaType.NETTY.getT() || this.getMetaType() == MetaType.WORKER.getT() ||
                  this.metaType == MetaType.TOPOLOGY.getT();
      }
  
      public String getFQN() {
          MetaType meta = MetaType.parse(metaType);
          MetricType metric = MetricType.parse(metricType);
          String types = meta.getV() + metric.getV();
          if (isWorkerMetric()) {
              return MetricUtils.concat2(types, topologyId, host, port, metricGroup, metricName);
          }
          return MetricUtils.concat2(types, topologyId, component, taskId, streamId, metricGroup, metricName);
      }
  
      /**
       * key: clusterName + topologyId + metaType + id
       */
      @Override
      public byte[] getKey() {
          StringBuilder sb = new StringBuilder(64);
          sb.append(clusterName).append(MetricUtils.AT).append(topologyId).append(MetricUtils.AT)
                  .append(metaType).append(MetricUtils.AT).append(id);
          return sb.toString().getBytes();
      }
  
      /**
       * value: component + taskId + streamId + metricType + host + port + metricGroup + metricName
       */
      @Override
      public byte[] getValue() {
          StringBuilder sb = new StringBuilder(64);
          sb.append(component).append(MetricUtils.AT).append(taskId).append(MetricUtils.AT)
                  .append(streamId).append(MetricUtils.AT).append(metricType).append(MetricUtils.AT)
                  .append(host).append(MetricUtils.AT).append(port).append(MetricUtils.AT)
                  .append(metricGroup).append(MetricUtils.AT).append(metricName);
          return sb.toString().getBytes();
      }
  
      @Override
      public Object fromKV(byte[] key, byte[] value) {
          String[] keyParts = new String(key).split(MetricUtils.DELIM);
          if (keyParts.length >= 4) {
              this.clusterName = keyParts[0];
              this.topologyId = keyParts[1];
              this.metaType = Integer.valueOf(keyParts[2]);
              this.id = Long.valueOf(keyParts[3]);
              this.sid = this.id + "";
          }
          String[] valueParts = new String(value).split(MetricUtils.DELIM);
          if (valueParts.length >= 8) {
              this.component = valueParts[0];
              this.taskId = JStormUtils.parseInt(valueParts[1], 0);
              this.streamId = valueParts[2];
              this.metricType = JStormUtils.parseInt(valueParts[3], 0);
              this.host = valueParts[4];
              this.port = JStormUtils.parseInt(valueParts[5], 0);
              this.metricGroup = valueParts[6];
              this.metricName = valueParts[7];
          }
          return this;
      }
  
      public static MetricMeta parse(String name) {
          return MetricMetaParser.fromMetricName(name);
      }
  
  }
  