/*
 * 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.
 *
 */

Service_Avg = from(Service.latency).longAvg();

ServiceInstance_RespTime= from(ServiceInstance.latency).longAvg();

Service_Calls_Sum = from(Service.*).sum();

Service_Relation_Calls_Sum = from(ServiceRelation.*).sum();

endpoint_Avg = from(Endpoint.latency).longAvg();

// endpoint_Avg_for_prod_serv = from(Endpoint.latency).filter(name == "/product/service").longAvg();

endpoint_percent = from(Endpoint.*).percent(status == true);

ServiceRelation_Avg = from(ServiceRelation.latency).longAvg();

ServiceInstanceRelation_Avg = from(ServiceInstanceRelation.latency).longAvg();

EndpointRelation_Avg = from(EndpointRelation.rpcLatency).longAvg();

instance_jvm_cpu = from(ServiceInstanceJVMCPU.usePercent).doubleAvg();

instance_jvm_memory_max = from(ServiceInstanceJVMMemory.max).longAvg();

instance_jvm_memory_pool_max = from(ServiceInstanceJVMMemoryPool.max).longAvg();

instance_jvm_young_gc_time = from(ServiceInstanceJVMGC.time).filter(phrase == GCPhrase.NEW).longAvg();