# 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. rules: - name: envoy-als layer: MESH dsl: | filter { // only collect abnormal logs (http status code >= 300, or commonProperties?.responseFlags is not empty) if (parsed?.response?.responseCode?.value as Integer < 400 && !parsed?.commonProperties?.responseFlags?.toString()?.trim()) { abort {} } extractor { if (parsed?.response?.responseCode) { tag 'status.code': parsed?.response?.responseCode?.value } tag 'response.flag': parsed?.commonProperties?.responseFlags } sink { sampler { if (parsed?.commonProperties?.responseFlags?.toString()) { // use service:errorCode as sampler id so that each service:errorCode has its own sampler, // e.g. checkoutservice:[upstreamConnectionFailure], checkoutservice:[upstreamRetryLimitExceeded] rateLimit("${log.service}:${parsed?.commonProperties?.responseFlags?.toString()}") { rpm 6000 } } else { // use service:responseCode as sampler id so that each service:responseCode has its own sampler, // e.g. checkoutservice:500, checkoutservice:404. rateLimit("${log.service}:${parsed?.response?.responseCode}") { rpm 6000 } } } } } - name: network-profiling-slow-trace layer: MESH dsl: | filter { json{ } extractor{ if (tag("LOG_KIND") == "NET_PROFILING_SAMPLED_TRACE") { sampledTrace { latency parsed.latency as Long uri parsed.uri as String reason parsed.reason as String if (parsed.client_process.process_id as String != "") { processId parsed.client_process.process_id as String } else if (parsed.client_process.local as Boolean) { processId ProcessRegistry.generateVirtualLocalProcess(parsed.service as String, parsed.serviceInstance as String) as String } else { processId ProcessRegistry.generateVirtualRemoteProcess(parsed.service as String, parsed.serviceInstance as String, parsed.client_process.address as String) as String } if (parsed.server_process.process_id as String != "") { destProcessId parsed.server_process.process_id as String } else if (parsed.server_process.local as Boolean) { destProcessId ProcessRegistry.generateVirtualLocalProcess(parsed.service as String, parsed.serviceInstance as String) as String } else { destProcessId ProcessRegistry.generateVirtualRemoteProcess(parsed.service as String, parsed.serviceInstance as String, parsed.server_process.address as String) as String } detectPoint parsed.detect_point as String if (parsed.component as String == "http" && parsed.ssl as Boolean) { componentId 129 } else if (parsed.component as String == "http") { componentId 49 } else if (parsed.ssl as Boolean) { componentId 130 } else { componentId 110 } } } } }