├── src ├── UpdateAddress │ ├── requirements.txt │ └── handler.py └── UpdateTargetGroup │ ├── requirements.txt │ └── handler.py ├── Launch-Stack.jpg ├── .gitignore ├── Serverless-NLB-Domain-as-TG.png ├── Serverless-NLB-Domain-as-TG-AGA.png ├── CloudWatch-Internet-Monitor ├── .DS_Store ├── Dashboard-CW-INET-MON-OpenSearch-Dashboards-V1.png ├── README.md ├── sample-lambda-s3-to-opensearch.py └── openearch-dashboard-template.ndjson ├── CODE_OF_CONDUCT.md ├── LICENSE ├── CONTRIBUTING.md ├── README.md ├── template.yaml └── nlb-access.yaml /src/UpdateAddress/requirements.txt: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /src/UpdateTargetGroup/requirements.txt: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /Launch-Stack.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aws-samples/aws-networking-workshop-sample/HEAD/Launch-Stack.jpg -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | .aws-composer 2 | .aws-sam 3 | .vscode 4 | test.md 5 | out.yaml 6 | ddb-event.json 7 | env.json.DS_Store 8 | -------------------------------------------------------------------------------- /Serverless-NLB-Domain-as-TG.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aws-samples/aws-networking-workshop-sample/HEAD/Serverless-NLB-Domain-as-TG.png -------------------------------------------------------------------------------- /Serverless-NLB-Domain-as-TG-AGA.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aws-samples/aws-networking-workshop-sample/HEAD/Serverless-NLB-Domain-as-TG-AGA.png -------------------------------------------------------------------------------- /CloudWatch-Internet-Monitor/.DS_Store: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aws-samples/aws-networking-workshop-sample/HEAD/CloudWatch-Internet-Monitor/.DS_Store -------------------------------------------------------------------------------- /CloudWatch-Internet-Monitor/Dashboard-CW-INET-MON-OpenSearch-Dashboards-V1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aws-samples/aws-networking-workshop-sample/HEAD/CloudWatch-Internet-Monitor/Dashboard-CW-INET-MON-OpenSearch-Dashboards-V1.png -------------------------------------------------------------------------------- /CODE_OF_CONDUCT.md: -------------------------------------------------------------------------------- 1 | ## Code of Conduct 2 | This project has adopted the [Amazon Open Source Code of Conduct](https://aws.github.io/code-of-conduct). 3 | For more information see the [Code of Conduct FAQ](https://aws.github.io/code-of-conduct-faq) or contact 4 | opensource-codeofconduct@amazon.com with any additional questions or comments. 5 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT No Attribution 2 | 3 | Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy of 6 | this software and associated documentation files (the "Software"), to deal in 7 | the Software without restriction, including without limitation the rights to 8 | use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of 9 | the Software, and to permit persons to whom the Software is furnished to do so. 10 | 11 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 12 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS 13 | FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR 14 | COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER 15 | IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN 16 | CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 17 | 18 | -------------------------------------------------------------------------------- /CloudWatch-Internet-Monitor/README.md: -------------------------------------------------------------------------------- 1 | # Analyzing Amazon CloudWatch Internet Monitor measurement logs using Amazon OpenSearch Service 2 | OpenSearch Service is a managed service that helps you deploy, operate, and scale OpenSearch domains (or clusters). Then you can use the OpenSearch Service Dashboard to create and share charts, dashboards, and reports that about your measurement events. In this section, we’ll describe how to use OpenSearch Service to view and visualize your data, and display and explore your events information. 3 | 4 | After ingest the CloudWatch Internet monitor measurements data to OpenSearch, you can visulize and get insight from AWS Internet Monitor measurements via OpenSearch Dashboard easily. 5 | 6 | - You can use the Map tool to display the internet experience score of different countries and cities on a world map, using different colors. 7 | 8 | - You can use a pie chart to show the ranking of multiple countries and cities, based on measurements. 9 | 10 | - You can show a bar chart of the top 100 cities by P50 latency ranking. 11 | 12 | - etc... 13 | 14 | 15 | 16 | ![Internet Monitor Dashboard Template](https://github.com/xzp1990/internetmonitordashboard/raw/main/Dashboard-CW-INET-MON-OpenSearch-Dashboards-V1.png) 17 | 18 | This sample was created by Jason Xie(AWS Enterprise Support Team) & Xulong Gao(AWS Solution Architect). -------------------------------------------------------------------------------- /src/UpdateAddress/handler.py: -------------------------------------------------------------------------------- 1 | import json 2 | import os 3 | import time 4 | import socket 5 | import boto3 6 | 7 | domainName = os.getenv('DOMAIN_NAME') 8 | tableName = os.getenv('TABLE_NAME') 9 | 10 | 11 | def handler(event, context): 12 | # get all dns ip address from a domain name 13 | addresses = [] 14 | infos = socket.getaddrinfo( 15 | domainName, None, family=socket.AF_INET, type=socket.SOCK_STREAM, proto=0, flags=0) 16 | for info in infos: 17 | addresses.append(info[4][0]) 18 | # sort array 19 | addresses.sort() 20 | # remove duplicate 21 | addresses = list(set(addresses)) 22 | # get timestamp 23 | now = int(time.time()) 24 | 25 | # get domain, addresses and timestamp from dynamodb 26 | dynamodb = boto3.resource('dynamodb') 27 | table = dynamodb.Table(tableName) 28 | response = table.get_item(Key={'Domain': domainName}) 29 | 30 | if 'Item' in response and 'Timestamp' in response['Item'] and response['Item']['Timestamp'] > now: 31 | return {} 32 | 33 | if 'Item' not in response or response['Item']['Address'] != json.dumps(addresses): 34 | # write domain, addresses and timestamp to dynamodb 35 | item = { 36 | 'Domain': domainName, 37 | 'Address': json.dumps(addresses), 38 | 'Timestamp': now 39 | } 40 | table.put_item(Item=item) 41 | 42 | return {} 43 | -------------------------------------------------------------------------------- /src/UpdateTargetGroup/handler.py: -------------------------------------------------------------------------------- 1 | import json 2 | import os 3 | import boto3 4 | 5 | targetGroupARN = os.getenv('TARGETGROUP_ARN') 6 | targetGroupPort = os.getenv('TARGETGROUP_PORT') 7 | 8 | 9 | def handler(event, context): 10 | # Log the event argument for debugging and for use in local development. 11 | print(json.dumps(event)) 12 | 13 | for event in event['Records']: 14 | if event['eventName'] != 'INSERT' and event['eventName'] != 'MODIFY': 15 | continue 16 | addresses = json.loads(event['dynamodb']['NewImage']['Address']['S']) 17 | 18 | # Target group client 19 | targetGroup = boto3.client('elbv2') 20 | # Get targets from target group 21 | targets = targetGroup.describe_target_health( 22 | TargetGroupArn=targetGroupARN) 23 | if 'TargetHealthDescriptions' in targets: 24 | for target in targets['TargetHealthDescriptions']: 25 | if target['Target']['Id'] in addresses and target['Target']['Port'] == int(targetGroupPort): 26 | # Remove item from adresses 27 | print(target['Target']['Id'], 'remove from addresses list') 28 | addresses.remove(target['Target']['Id']) 29 | continue 30 | if target['Target']['Id'] not in addresses and target['Target']['Port'] == int(targetGroupPort): 31 | # Remove target from target group 32 | print(target['Target']['Id'], 'remove from target group') 33 | targetGroup.deregister_targets(TargetGroupArn=targetGroupARN, Targets=[ 34 | {'Id': target['Target']['Id'], 'Port': int(targetGroupPort)}]) 35 | # add address to target group 36 | for address in addresses: 37 | print(address, 'add to target group') 38 | targetGroup.register_targets(TargetGroupArn=targetGroupARN, Targets=[ 39 | {'Id': address, 'Port': int(targetGroupPort)}]) 40 | return {} 41 | -------------------------------------------------------------------------------- /CONTRIBUTING.md: -------------------------------------------------------------------------------- 1 | # Contributing Guidelines 2 | 3 | Thank you for your interest in contributing to our project. Whether it's a bug report, new feature, correction, or additional 4 | documentation, we greatly value feedback and contributions from our community. 5 | 6 | Please read through this document before submitting any issues or pull requests to ensure we have all the necessary 7 | information to effectively respond to your bug report or contribution. 8 | 9 | 10 | ## Reporting Bugs/Feature Requests 11 | 12 | We welcome you to use the GitHub issue tracker to report bugs or suggest features. 13 | 14 | When filing an issue, please check existing open, or recently closed, issues to make sure somebody else hasn't already 15 | reported the issue. Please try to include as much information as you can. Details like these are incredibly useful: 16 | 17 | * A reproducible test case or series of steps 18 | * The version of our code being used 19 | * Any modifications you've made relevant to the bug 20 | * Anything unusual about your environment or deployment 21 | 22 | 23 | ## Contributing via Pull Requests 24 | Contributions via pull requests are much appreciated. Before sending us a pull request, please ensure that: 25 | 26 | 1. You are working against the latest source on the *main* branch. 27 | 2. You check existing open, and recently merged, pull requests to make sure someone else hasn't addressed the problem already. 28 | 3. You open an issue to discuss any significant work - we would hate for your time to be wasted. 29 | 30 | To send us a pull request, please: 31 | 32 | 1. Fork the repository. 33 | 2. Modify the source; please focus on the specific change you are contributing. If you also reformat all the code, it will be hard for us to focus on your change. 34 | 3. Ensure local tests pass. 35 | 4. Commit to your fork using clear commit messages. 36 | 5. Send us a pull request, answering any default questions in the pull request interface. 37 | 6. Pay attention to any automated CI failures reported in the pull request, and stay involved in the conversation. 38 | 39 | GitHub provides additional document on [forking a repository](https://help.github.com/articles/fork-a-repo/) and 40 | [creating a pull request](https://help.github.com/articles/creating-a-pull-request/). 41 | 42 | 43 | ## Finding contributions to work on 44 | Looking at the existing issues is a great way to find something to contribute on. As our projects, by default, use the default GitHub issue labels (enhancement/bug/duplicate/help wanted/invalid/question/wontfix), looking at any 'help wanted' issues is a great place to start. 45 | 46 | 47 | ## Code of Conduct 48 | This project has adopted the [Amazon Open Source Code of Conduct](https://aws.github.io/code-of-conduct). 49 | For more information see the [Code of Conduct FAQ](https://aws.github.io/code-of-conduct-faq) or contact 50 | opensource-codeofconduct@amazon.com with any additional questions or comments. 51 | 52 | 53 | ## Security issue notifications 54 | If you discover a potential security issue in this project we ask that you notify AWS/Amazon Security via our [vulnerability reporting page](http://aws.amazon.com/security/vulnerability-reporting/). Please do **not** create a public github issue. 55 | 56 | 57 | ## Licensing 58 | 59 | See the [LICENSE](LICENSE) file for our project's licensing. We will ask you to confirm the licensing of your contribution. 60 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | ## Enable NLB Support Domain Endpoint as TargetGroup by using Serverless Service 2 | 3 | ### Overview 4 | 5 | Amazon Web Services provides many excellent hosting services, such as Amazon Managed Streaming for Apache Kafka (Amazon MSK), Amazon ElastiCache, Amazon MemoryDB for Redis, Amazon RDS MySQL, etc. These hosting services can improve the availability and elasticity of workloads, and reduce the operation and management costs of basic resources. 6 | 7 | Most Amazon Web Services hosting services provide services through a domain name (DNS Name) based Endpoint, and clients access these services through the domain name Endpoint. But in some scenarios, some customers have some special restrictions that require access to the hosted service through IP or even fixed IP mode or through the Internet to access the intranet hosted service. In this case, some adjustments need to be made to the access method. This article will introduce how to use Network Load Balancer (NLB) to achieve the access to hosted services in special scenarios: 8 | 9 | - The request side requires access to the hosted database service (taking RDS MySQL cluster as an example) through IP or fixed IP mode 10 | - The request side is on the Internet and needs to access the hosted service through the Internet (taking Elasticache for Redis service as an example) 11 | - Note: In order to ensure the security of data transmission, ElastiCache does not support opening Internet access natively. The official document of Amazon Web Services recommends connecting to the VPC internally through a dedicated line or IPsec VPN for secure access. The method of opening intranet hosting services to the Internet for access in this article is recommended for testing and evaluation environments only, and should be used with caution in production environments. 12 | 13 | ### Solution Architecture (Clients in AWS VPC) 14 | This article demonstrates a serverless approach to working with NLB using Lambda functions, EventBridge, DynamoDB and other key services. This solution is easy to deploy and maintain, and offers good cost-effectiveness, thanks to the serverless architecture. 15 | 16 | ![Architecture image](Serverless-NLB-Domain-as-TG.png) 17 | 18 | 19 | #### Solution Architecture Description 20 | 21 | 1.Use Amazon EventBridge to create scheduled tasks and event-triggered tasks to invoke Lambda-01 function. 22 | 23 | 2.When Lambda-01 function is invoked, it performs DNS queries for the target endpoint domain name and obtains the current IP address list of the endpoint. 24 | 25 | 3.Lambda-01 stores the obtained IP list (new list) in DynamoDB. 26 | 27 | 4.DynamoDB invokes Lambda-02 through an event. 28 | 29 | 5.Lambda-02 retrieves the IP address corresponding to the endpoint domain name from DynamoDB and calls decribe-target-health to query the IP addresses already registered in the current NLB TargetGroup and compare them, performing incremental updates: 30 | - Register the new IP addresses that appear in the new list to the NLB TargetGroup 31 | - Deregister the old IP addresses that do not appear in the new list from the NLB TargetGroup 32 | 33 | 6.The request side (Client) accesses the static IP address of the NLB in the VPC 34 | 35 | 7.The VPC NLB sends requests from the VPC application side (Client) to the instance IP of the hosted service in the TargetGroup. 36 | 37 | ### Deployment 38 | 39 | 40 | ![Launch-Button](Launch-Stack.jpg) 41 | 42 | ([YAML](nlb-access.yaml) for Amazon CloudFormation) 43 | 44 | 45 | ### Extended Solution Architecture (Client Accessing from the Internet Scenario) 46 | 47 | In the above steps, we have achieved the goal of using NLB to distribute requests to domain names as its target group, allowing the request side to directly access the hosted service through the fixed VPC IP of the NLB. If we need to access it through the Internet, we need to slightly extend the above solution. 48 | 49 | ![Architecture image](Serverless-NLB-Domain-as-TG-AGA.png) 50 | 51 | 52 | 53 | 54 | 55 | ## Security 56 | 57 | See [CONTRIBUTING](CONTRIBUTING.md#security-issue-notifications) for more information. 58 | 59 | ## License 60 | 61 | This library is licensed under the MIT-0 License. See the LICENSE file. 62 | 63 | -------------------------------------------------------------------------------- /template.yaml: -------------------------------------------------------------------------------- 1 | AWSTemplateFormatVersion: '2010-09-09' 2 | Transform: AWS::Serverless-2016-10-31 3 | Description: NLB Proxy for Endpoint. 4 | Parameters: 5 | DomainName: 6 | Type: String 7 | TargetGroupARN: 8 | Type: String 9 | TargetGroupPort: 10 | Type: Number 11 | Resources: 12 | Schedule: 13 | Type: AWS::Scheduler::Schedule 14 | Properties: 15 | ScheduleExpression: rate(1 minute) 16 | FlexibleTimeWindow: 17 | Mode: 'OFF' 18 | Target: 19 | Arn: !GetAtt UpdateAddress.Arn 20 | RoleArn: !GetAtt ScheduleToUpdateAddressRole.Arn 21 | UpdateAddress: 22 | Type: AWS::Serverless::Function 23 | Properties: 24 | Description: !Sub 25 | - Stack ${AWS::StackName} Function ${ResourceName} 26 | - ResourceName: UpdateAddress 27 | CodeUri: src/UpdateAddress 28 | Handler: handler.handler 29 | Runtime: python3.9 30 | MemorySize: 128 31 | Timeout: 180 32 | Tracing: Active 33 | Environment: 34 | Variables: 35 | TABLE_NAME: !Ref DomainInfo 36 | DOMAIN_NAME: !Ref DomainName 37 | Policies: 38 | - DynamoDBCrudPolicy: 39 | TableName: !Ref DomainInfo 40 | UpdateAddressLogGroup: 41 | Type: AWS::Logs::LogGroup 42 | DeletionPolicy: Retain 43 | Properties: 44 | LogGroupName: !Sub /aws/lambda/${UpdateAddress} 45 | ScheduleToUpdateAddressRole: 46 | Type: AWS::IAM::Role 47 | Properties: 48 | AssumeRolePolicyDocument: 49 | Version: '2012-10-17' 50 | Statement: 51 | Effect: Allow 52 | Principal: 53 | Service: !Sub scheduler.${AWS::URLSuffix} 54 | Action: sts:AssumeRole 55 | Condition: 56 | ArnLike: 57 | aws:SourceArn: !Sub 58 | - arn:${AWS::Partition}:scheduler:${AWS::Region}:${AWS::AccountId}:schedule/*/${AWS::StackName}-${ResourceId}-* 59 | - ResourceId: Schedule 60 | Policies: 61 | - PolicyName: StartExecutionPolicy 62 | PolicyDocument: 63 | Version: '2012-10-17' 64 | Statement: 65 | - Effect: Allow 66 | Action: lambda:InvokeFunction 67 | Resource: !GetAtt UpdateAddress.Arn 68 | UpdateTargetGroup: 69 | Type: AWS::Serverless::Function 70 | Properties: 71 | Description: !Sub 72 | - Stack ${AWS::StackName} Function ${ResourceName} 73 | - ResourceName: UpdateTargetGroup 74 | CodeUri: src/UpdateTargetGroup 75 | Handler: handler.handler 76 | Runtime: python3.9 77 | MemorySize: 128 78 | Timeout: 180 79 | Tracing: Active 80 | Environment: 81 | Variables: 82 | TARGETGROUP_ARN: !Ref TargetGroupARN 83 | TARGETGROUP_PORT: !Ref TargetGroupPort 84 | Policies: 85 | - Version: '2012-10-17' 86 | Statement: 87 | - Effect: Allow 88 | Action: 89 | - elasticloadbalancing:RegisterTargets 90 | - elasticloadbalancing:DeregisterTargets 91 | Resource: !Ref TargetGroupARN 92 | - Effect: Allow 93 | Action: 94 | - elasticloadbalancing:DescribeTargetHealth 95 | Resource: '*' 96 | Events: 97 | DomainInfo: 98 | Type: DynamoDB 99 | Properties: 100 | Stream: !GetAtt DomainInfo.StreamArn 101 | StartingPosition: LATEST 102 | BatchSize: 1 103 | UpdateTargetGroupLogGroup: 104 | Type: AWS::Logs::LogGroup 105 | DeletionPolicy: Retain 106 | Properties: 107 | LogGroupName: !Sub /aws/lambda/${UpdateTargetGroup} 108 | DomainInfo: 109 | Type: AWS::DynamoDB::Table 110 | Properties: 111 | AttributeDefinitions: 112 | - AttributeName: Domain 113 | AttributeType: S 114 | BillingMode: PROVISIONED 115 | ProvisionedThroughput: 116 | ReadCapacityUnits: 3 117 | WriteCapacityUnits: 3 118 | KeySchema: 119 | - AttributeName: Domain 120 | KeyType: HASH 121 | StreamSpecification: 122 | StreamViewType: NEW_AND_OLD_IMAGES -------------------------------------------------------------------------------- /CloudWatch-Internet-Monitor/sample-lambda-s3-to-opensearch.py: -------------------------------------------------------------------------------- 1 | ''' 2 | Amazon CloudWatch Internet Monitor supports sending logs to Amazon S3. 3 | When Amazon S3 receives a new log, it will trigger Lambda through an event. 4 | After decompressing the log, the Lambda will send the logs to Amazon OpenSearch Service in a suitable format. 5 | --by Xulong Gao 6 | ''' 7 | 8 | ''' 9 | 20230620 Update-XulongGao 10 | 1,auto create new index in every day 11 | 2,enhanced logical when round_trip_time is not exists 12 | ''' 13 | import datetime 14 | import pytz 15 | import gzip 16 | import json 17 | import requests 18 | import boto3 19 | from requests_aws4auth import AWS4Auth 20 | 21 | region = 'sa-east-1' # e.g. us-west-1 22 | service = 'es' 23 | credentials = boto3.Session().get_credentials() 24 | awsauth = AWS4Auth(credentials.access_key, credentials.secret_key, region, service, session_token=credentials.token) 25 | host = 'https://your-OpenSearch-domain.sa-east-1.es.amazonaws.com' 26 | datatype = '_doc' 27 | headers = {"Content-Type": "application/json"} 28 | s3 = boto3.client('s3') 29 | 30 | 31 | def lambda_handler(event, context): 32 | tz = pytz.timezone('Asia/Shanghai') 33 | current_date = datetime.datetime.now(tz).strftime("%Y-%m-%d") 34 | index = 'lambda-s3-' + current_date 35 | url = host + '/' + index + '/' + datatype 36 | 37 | for record in event['Records']: 38 | bucket = record['s3']['bucket']['name'] 39 | key = record['s3']['object']['key'] 40 | obj = s3.get_object(Bucket=bucket, Key=key) 41 | body = obj['Body'].read() 42 | if key.endswith('.gz'): 43 | body = gzip.decompress(body) 44 | lines = body.splitlines() 45 | for line in lines: 46 | line = line.decode("utf-8") 47 | message = json.loads(line) # parse JSON object 48 | 49 | #Check if round_trip_time exists 50 | round_trip_time = message["internetHealth"]["performance"].get("roundTripTime") 51 | p50_round_trip_time = round_trip_time.get("p50") if round_trip_time else None 52 | p90_round_trip_time = round_trip_time.get("p90") if round_trip_time else None 53 | p95_round_trip_time = round_trip_time.get("p95") if round_trip_time else None 54 | 55 | document = { 56 | "timestamp": message.get("timestamp"), 57 | "latitude": message["clientLocation"].get("latitude"), 58 | "longitude": message["clientLocation"].get("longitude"), 59 | "country": message["clientLocation"].get("country"), 60 | "subdivision": message["clientLocation"].get("subdivision"), 61 | "metro": message["clientLocation"].get("metro"), 62 | "city": message["clientLocation"].get("city"), 63 | "countryCode": message["clientLocation"].get("countryCode"), 64 | "subdivisionCode": message["clientLocation"].get("subdivisionCode"), 65 | "asn": message["clientLocation"].get("asn"), 66 | "networkName": message["clientLocation"].get("networkName"), 67 | "serviceLocation": message.get("serviceLocation"), 68 | "percentageOfTotalTraffic": message.get("percentageOfTotalTraffic"), 69 | "bytesIn": message.get("bytesIn"), 70 | "bytesOut": message.get("bytesOut"), 71 | "clientConnectionCount": message.get("clientConnectionCount"), 72 | "availabilityExperienceScore": message["internetHealth"]["availability"].get("experienceScore"), 73 | "availabilityPercentageOfTotalTrafficImpacted": message["internetHealth"]["availability"].get( 74 | "percentageOfTotalTrafficImpacted"), 75 | "availabilityPercentageOfClientLocationImpacted": message["internetHealth"]["availability"].get( 76 | "percentageOfClientLocationImpacted"), 77 | "performanceExperienceScore": message["internetHealth"]["performance"].get("experienceScore"), 78 | "performancePercentageOfTotalTrafficImpacted": message["internetHealth"]["performance"].get( 79 | "percentageOfTotalTrafficImpacted"), 80 | "performancePercentageOfClientLocationImpacted": message["internetHealth"]["performance"].get( 81 | "percentageOfClientLocationImpacted"), 82 | "p50RoundTripTime": p50_round_trip_time, 83 | "p90RoundTripTime": p90_round_trip_time, 84 | "p95RoundTripTime": p95_round_trip_time 85 | } 86 | 87 | r = requests.post(url, auth=awsauth, json=document, headers=headers) 88 | -------------------------------------------------------------------------------- /nlb-access.yaml: -------------------------------------------------------------------------------- 1 | AWSTemplateFormatVersion: '2010-09-09' 2 | Transform: AWS::Serverless-2016-10-31 3 | Description: NLB Proxy for Endpoint. 4 | Parameters: 5 | DomainName: 6 | Type: String 7 | TargetGroupARN: 8 | Type: String 9 | TargetGroupPort: 10 | Type: Number 11 | Resources: 12 | Schedule: 13 | Type: AWS::Scheduler::Schedule 14 | Properties: 15 | ScheduleExpression: rate(1 minute) 16 | FlexibleTimeWindow: 17 | Mode: 'OFF' 18 | Target: 19 | Arn: 20 | Fn::GetAtt: 21 | - UpdateAddress 22 | - Arn 23 | RoleArn: 24 | Fn::GetAtt: 25 | - ScheduleToUpdateAddressRole 26 | - Arn 27 | UpdateAddress: 28 | Type: AWS::Serverless::Function 29 | Properties: 30 | Description: 31 | Fn::Sub: 32 | - Stack ${AWS::StackName} Function ${ResourceName} 33 | - ResourceName: UpdateAddress 34 | InlineCode: | 35 | import json 36 | import os 37 | import time 38 | import socket 39 | import boto3 40 | 41 | domainName = os.getenv('DOMAIN_NAME') 42 | tableName = os.getenv('TABLE_NAME') 43 | 44 | 45 | def handler(event, context): 46 | # get all dns ip address from a domain name 47 | addresses = [] 48 | infos = socket.getaddrinfo( 49 | domainName, None, family=socket.AF_INET, type=socket.SOCK_STREAM, proto=0, flags=0) 50 | for info in infos: 51 | addresses.append(info[4][0]) 52 | # sort array 53 | addresses.sort() 54 | # remove duplicate 55 | addresses = list(set(addresses)) 56 | # get timestamp 57 | now = int(time.time()) 58 | 59 | # get domain, addresses and timestamp from dynamodb 60 | dynamodb = boto3.resource('dynamodb') 61 | table = dynamodb.Table(tableName) 62 | response = table.get_item(Key={'Domain': domainName}) 63 | 64 | if 'Item' in response and 'Timestamp' in response['Item'] and response['Item']['Timestamp'] > now: 65 | return {} 66 | 67 | if 'Item' not in response or response['Item']['Address'] != json.dumps(addresses): 68 | # write domain, addresses and timestamp to dynamodb 69 | item = { 70 | 'Domain': domainName, 71 | 'Address': json.dumps(addresses), 72 | 'Timestamp': now 73 | } 74 | table.put_item(Item=item) 75 | 76 | return {} 77 | Handler: handler.handler 78 | Runtime: python3.9 79 | MemorySize: 128 80 | Timeout: 180 81 | Tracing: Active 82 | Environment: 83 | Variables: 84 | TABLE_NAME: 85 | Ref: DomainInfo 86 | DOMAIN_NAME: 87 | Ref: DomainName 88 | Policies: 89 | - DynamoDBCrudPolicy: 90 | TableName: 91 | Ref: DomainInfo 92 | UpdateAddressLogGroup: 93 | Type: AWS::Logs::LogGroup 94 | DeletionPolicy: Retain 95 | Properties: 96 | LogGroupName: 97 | Fn::Sub: /aws/lambda/${UpdateAddress} 98 | ScheduleToUpdateAddressRole: 99 | Type: AWS::IAM::Role 100 | Properties: 101 | AssumeRolePolicyDocument: 102 | Version: '2012-10-17' 103 | Statement: 104 | Effect: Allow 105 | Principal: 106 | Service: 107 | Fn::Sub: scheduler.${AWS::URLSuffix} 108 | Action: sts:AssumeRole 109 | Condition: 110 | ArnLike: 111 | aws:SourceArn: 112 | Fn::Sub: 113 | - arn:${AWS::Partition}:scheduler:${AWS::Region}:${AWS::AccountId}:schedule/*/${AWS::StackName}-${ResourceId}-* 114 | - ResourceId: Schedule 115 | Policies: 116 | - PolicyName: StartExecutionPolicy 117 | PolicyDocument: 118 | Version: '2012-10-17' 119 | Statement: 120 | - Effect: Allow 121 | Action: lambda:InvokeFunction 122 | Resource: 123 | Fn::GetAtt: 124 | - UpdateAddress 125 | - Arn 126 | UpdateTargetGroup: 127 | Type: AWS::Serverless::Function 128 | Properties: 129 | Description: 130 | Fn::Sub: 131 | - Stack ${AWS::StackName} Function ${ResourceName} 132 | - ResourceName: UpdateTargetGroup 133 | InlineCode: | 134 | import json 135 | import os 136 | import boto3 137 | 138 | targetGroupARN = os.getenv('TARGETGROUP_ARN') 139 | targetGroupPort = os.getenv('TARGETGROUP_PORT') 140 | 141 | 142 | def handler(event, context): 143 | # Log the event argument for debugging and for use in local development. 144 | print(json.dumps(event)) 145 | 146 | for event in event['Records']: 147 | if event['eventName'] != 'INSERT' and event['eventName'] != 'MODIFY': 148 | continue 149 | addresses = json.loads(event['dynamodb']['NewImage']['Address']['S']) 150 | 151 | # Target group client 152 | targetGroup = boto3.client('elbv2') 153 | # Get targets from target group 154 | targets = targetGroup.describe_target_health( 155 | TargetGroupArn=targetGroupARN) 156 | if 'TargetHealthDescriptions' in targets: 157 | for target in targets['TargetHealthDescriptions']: 158 | if target['Target']['Id'] in addresses and target['Target']['Port'] == int(targetGroupPort): 159 | # Remove item from adresses 160 | print(target['Target']['Id'], 'remove from addresses list') 161 | addresses.remove(target['Target']['Id']) 162 | continue 163 | if target['Target']['Id'] not in addresses and target['Target']['Port'] == int(targetGroupPort): 164 | # Remove target from target group 165 | print(target['Target']['Id'], 'remove from target group') 166 | targetGroup.deregister_targets(TargetGroupArn=targetGroupARN, Targets=[ 167 | {'Id': target['Target']['Id'], 'Port': int(targetGroupPort)}]) 168 | # add address to target group 169 | for address in addresses: 170 | print(address, 'add to target group') 171 | targetGroup.register_targets(TargetGroupArn=targetGroupARN, Targets=[ 172 | {'Id': address, 'Port': int(targetGroupPort)}]) 173 | return {} 174 | Handler: handler.handler 175 | Runtime: python3.9 176 | MemorySize: 128 177 | Timeout: 180 178 | Tracing: Active 179 | Environment: 180 | Variables: 181 | TARGETGROUP_ARN: 182 | Ref: TargetGroupARN 183 | TARGETGROUP_PORT: 184 | Ref: TargetGroupPort 185 | Policies: 186 | - Version: '2012-10-17' 187 | Statement: 188 | - Effect: Allow 189 | Action: 190 | - elasticloadbalancing:RegisterTargets 191 | - elasticloadbalancing:DeregisterTargets 192 | Resource: 193 | Ref: TargetGroupARN 194 | - Effect: Allow 195 | Action: 196 | - elasticloadbalancing:DescribeTargetHealth 197 | Resource: '*' 198 | Events: 199 | DomainInfo: 200 | Type: DynamoDB 201 | Properties: 202 | Stream: 203 | Fn::GetAtt: 204 | - DomainInfo 205 | - StreamArn 206 | StartingPosition: LATEST 207 | BatchSize: 1 208 | UpdateTargetGroupLogGroup: 209 | Type: AWS::Logs::LogGroup 210 | DeletionPolicy: Retain 211 | Properties: 212 | LogGroupName: 213 | Fn::Sub: /aws/lambda/${UpdateTargetGroup} 214 | DomainInfo: 215 | Type: AWS::DynamoDB::Table 216 | Properties: 217 | AttributeDefinitions: 218 | - AttributeName: Domain 219 | AttributeType: S 220 | BillingMode: PROVISIONED 221 | ProvisionedThroughput: 222 | ReadCapacityUnits: 3 223 | WriteCapacityUnits: 3 224 | KeySchema: 225 | - AttributeName: Domain 226 | KeyType: HASH 227 | StreamSpecification: 228 | StreamViewType: NEW_AND_OLD_IMAGES 229 | -------------------------------------------------------------------------------- /CloudWatch-Internet-Monitor/openearch-dashboard-template.ndjson: -------------------------------------------------------------------------------- 1 | {"attributes":{"fields":"[{\"count\":0,\"name\":\"@id\",\"type\":\"string\",\"esTypes\":[\"text\"],\"scripted\":false,\"searchable\":true,\"aggregatable\":false,\"readFromDocValues\":false},{\"count\":0,\"name\":\"@id.keyword\",\"type\":\"string\",\"esTypes\":[\"keyword\"],\"scripted\":false,\"searchable\":true,\"aggregatable\":true,\"readFromDocValues\":true,\"subType\":{\"multi\":{\"parent\":\"@id\"}}},{\"count\":0,\"name\":\"@log_group\",\"type\":\"string\",\"esTypes\":[\"text\"],\"scripted\":false,\"searchable\":true,\"aggregatable\":false,\"readFromDocValues\":false},{\"count\":0,\"name\":\"@log_group.keyword\",\"type\":\"string\",\"esTypes\":[\"keyword\"],\"scripted\":false,\"searchable\":true,\"aggregatable\":true,\"readFromDocValues\":true,\"subType\":{\"multi\":{\"parent\":\"@log_group\"}}},{\"count\":0,\"name\":\"@log_stream\",\"type\":\"string\",\"esTypes\":[\"text\"],\"scripted\":false,\"searchable\":true,\"aggregatable\":false,\"readFromDocValues\":false},{\"count\":0,\"name\":\"@log_stream.keyword\",\"type\":\"string\",\"esTypes\":[\"keyword\"],\"scripted\":false,\"searchable\":true,\"aggregatable\":true,\"readFromDocValues\":true,\"subType\":{\"multi\":{\"parent\":\"@log_stream\"}}},{\"count\":0,\"name\":\"@message\",\"type\":\"string\",\"esTypes\":[\"text\"],\"scripted\":false,\"searchable\":true,\"aggregatable\":false,\"readFromDocValues\":false},{\"count\":0,\"name\":\"@message.keyword\",\"type\":\"string\",\"esTypes\":[\"keyword\"],\"scripted\":false,\"searchable\":true,\"aggregatable\":true,\"readFromDocValues\":true,\"subType\":{\"multi\":{\"parent\":\"@message\"}}},{\"count\":0,\"name\":\"@owner\",\"type\":\"string\",\"esTypes\":[\"text\"],\"scripted\":false,\"searchable\":true,\"aggregatable\":false,\"readFromDocValues\":false},{\"count\":0,\"name\":\"@owner.keyword\",\"type\":\"string\",\"esTypes\":[\"keyword\"],\"scripted\":false,\"searchable\":true,\"aggregatable\":true,\"readFromDocValues\":true,\"subType\":{\"multi\":{\"parent\":\"@owner\"}}},{\"count\":1,\"name\":\"@timestamp\",\"type\":\"date\",\"esTypes\":[\"date\"],\"scripted\":false,\"searchable\":true,\"aggregatable\":true,\"readFromDocValues\":true},{\"count\":0,\"name\":\"_id\",\"type\":\"string\",\"esTypes\":[\"_id\"],\"scripted\":false,\"searchable\":true,\"aggregatable\":true,\"readFromDocValues\":false},{\"count\":0,\"name\":\"_index\",\"type\":\"string\",\"esTypes\":[\"_index\"],\"scripted\":false,\"searchable\":true,\"aggregatable\":true,\"readFromDocValues\":false},{\"count\":0,\"name\":\"_score\",\"type\":\"number\",\"scripted\":false,\"searchable\":false,\"aggregatable\":false,\"readFromDocValues\":false},{\"count\":0,\"name\":\"_source\",\"type\":\"_source\",\"esTypes\":[\"_source\"],\"scripted\":false,\"searchable\":false,\"aggregatable\":false,\"readFromDocValues\":false},{\"count\":0,\"name\":\"_type\",\"type\":\"string\",\"scripted\":false,\"searchable\":false,\"aggregatable\":false,\"readFromDocValues\":false},{\"count\":0,\"name\":\"bytesIn\",\"type\":\"number\",\"esTypes\":[\"long\"],\"scripted\":false,\"searchable\":true,\"aggregatable\":true,\"readFromDocValues\":true},{\"count\":0,\"name\":\"bytesOut\",\"type\":\"number\",\"esTypes\":[\"long\"],\"scripted\":false,\"searchable\":true,\"aggregatable\":true,\"readFromDocValues\":true},{\"count\":0,\"name\":\"clientConnectionCount\",\"type\":\"number\",\"esTypes\":[\"integer\"],\"scripted\":false,\"searchable\":true,\"aggregatable\":true,\"readFromDocValues\":true},{\"count\":7,\"name\":\"clientLocation.asn\",\"type\":\"number\",\"esTypes\":[\"integer\"],\"scripted\":false,\"searchable\":true,\"aggregatable\":true,\"readFromDocValues\":true},{\"count\":5,\"name\":\"clientLocation.city\",\"type\":\"string\",\"esTypes\":[\"keyword\"],\"scripted\":false,\"searchable\":true,\"aggregatable\":true,\"readFromDocValues\":true},{\"count\":6,\"name\":\"clientLocation.country\",\"type\":\"string\",\"esTypes\":[\"keyword\"],\"scripted\":false,\"searchable\":true,\"aggregatable\":true,\"readFromDocValues\":true},{\"count\":0,\"name\":\"clientLocation.countryCode\",\"type\":\"string\",\"esTypes\":[\"keyword\"],\"scripted\":false,\"searchable\":true,\"aggregatable\":true,\"readFromDocValues\":true},{\"count\":0,\"name\":\"clientLocation.latitude\",\"type\":\"number\",\"esTypes\":[\"float\"],\"scripted\":false,\"searchable\":true,\"aggregatable\":true,\"readFromDocValues\":true},{\"count\":0,\"name\":\"clientLocation.longitude\",\"type\":\"number\",\"esTypes\":[\"float\"],\"scripted\":false,\"searchable\":true,\"aggregatable\":true,\"readFromDocValues\":true},{\"count\":0,\"name\":\"clientLocation.metro\",\"type\":\"string\",\"esTypes\":[\"keyword\"],\"scripted\":false,\"searchable\":true,\"aggregatable\":true,\"readFromDocValues\":true},{\"count\":1,\"name\":\"clientLocation.networkName\",\"type\":\"string\",\"esTypes\":[\"keyword\"],\"scripted\":false,\"searchable\":true,\"aggregatable\":true,\"readFromDocValues\":true},{\"count\":0,\"name\":\"clientLocation.subdivision\",\"type\":\"string\",\"esTypes\":[\"keyword\"],\"scripted\":false,\"searchable\":true,\"aggregatable\":true,\"readFromDocValues\":true},{\"count\":0,\"name\":\"clientLocation.subdivisionCode\",\"type\":\"string\",\"esTypes\":[\"keyword\"],\"scripted\":false,\"searchable\":true,\"aggregatable\":true,\"readFromDocValues\":true},{\"count\":3,\"name\":\"internetHealth.availability.experienceScore\",\"type\":\"number\",\"esTypes\":[\"integer\"],\"scripted\":false,\"searchable\":true,\"aggregatable\":true,\"readFromDocValues\":true},{\"count\":0,\"name\":\"internetHealth.availability.percentageOfClientLocationImpacted\",\"type\":\"number\",\"esTypes\":[\"float\"],\"scripted\":false,\"searchable\":true,\"aggregatable\":true,\"readFromDocValues\":true},{\"count\":0,\"name\":\"internetHealth.availability.percentageOfTotalTrafficImpacted\",\"type\":\"number\",\"esTypes\":[\"float\"],\"scripted\":false,\"searchable\":true,\"aggregatable\":true,\"readFromDocValues\":true},{\"count\":2,\"name\":\"internetHealth.performance.experienceScore\",\"type\":\"number\",\"esTypes\":[\"integer\"],\"scripted\":false,\"searchable\":true,\"aggregatable\":true,\"readFromDocValues\":true},{\"count\":0,\"name\":\"internetHealth.performance.percentageOfClientLocationImpacted\",\"type\":\"number\",\"esTypes\":[\"float\"],\"scripted\":false,\"searchable\":true,\"aggregatable\":true,\"readFromDocValues\":true},{\"count\":0,\"name\":\"internetHealth.performance.percentageOfTotalTrafficImpacted\",\"type\":\"number\",\"esTypes\":[\"float\"],\"scripted\":false,\"searchable\":true,\"aggregatable\":true,\"readFromDocValues\":true},{\"count\":1,\"name\":\"internetHealth.performance.roundTripTime.p50\",\"type\":\"number\",\"esTypes\":[\"float\"],\"scripted\":false,\"searchable\":true,\"aggregatable\":true,\"readFromDocValues\":true},{\"count\":1,\"name\":\"internetHealth.performance.roundTripTime.p90\",\"type\":\"number\",\"esTypes\":[\"float\"],\"scripted\":false,\"searchable\":true,\"aggregatable\":true,\"readFromDocValues\":true},{\"count\":3,\"name\":\"internetHealth.performance.roundTripTime.p95\",\"type\":\"number\",\"esTypes\":[\"float\"],\"scripted\":false,\"searchable\":true,\"aggregatable\":true,\"readFromDocValues\":true},{\"count\":0,\"name\":\"percentageOfTotalTraffic\",\"type\":\"number\",\"esTypes\":[\"float\"],\"scripted\":false,\"searchable\":true,\"aggregatable\":true,\"readFromDocValues\":true},{\"count\":3,\"name\":\"serviceLocation\",\"type\":\"string\",\"esTypes\":[\"keyword\"],\"scripted\":false,\"searchable\":true,\"aggregatable\":true,\"readFromDocValues\":true},{\"count\":0,\"name\":\"timestamp\",\"type\":\"date\",\"esTypes\":[\"date\"],\"scripted\":false,\"searchable\":true,\"aggregatable\":true,\"readFromDocValues\":true},{\"count\":3,\"name\":\"trafficInsights.timeToFirstByte.cloudfront.serviceLocation\",\"type\":\"string\",\"esTypes\":[\"text\"],\"scripted\":false,\"searchable\":true,\"aggregatable\":false,\"readFromDocValues\":false},{\"count\":0,\"name\":\"trafficInsights.timeToFirstByte.cloudfront.serviceLocation.keyword\",\"type\":\"string\",\"esTypes\":[\"keyword\"],\"scripted\":false,\"searchable\":true,\"aggregatable\":true,\"readFromDocValues\":true,\"subType\":{\"multi\":{\"parent\":\"trafficInsights.timeToFirstByte.cloudfront.serviceLocation\"}}},{\"count\":3,\"name\":\"trafficInsights.timeToFirstByte.cloudfront.serviceName\",\"type\":\"string\",\"esTypes\":[\"text\"],\"scripted\":false,\"searchable\":true,\"aggregatable\":false,\"readFromDocValues\":false},{\"count\":0,\"name\":\"trafficInsights.timeToFirstByte.cloudfront.serviceName.keyword\",\"type\":\"string\",\"esTypes\":[\"keyword\"],\"scripted\":false,\"searchable\":true,\"aggregatable\":true,\"readFromDocValues\":true,\"subType\":{\"multi\":{\"parent\":\"trafficInsights.timeToFirstByte.cloudfront.serviceName\"}}},{\"count\":3,\"name\":\"trafficInsights.timeToFirstByte.cloudfront.value\",\"type\":\"number\",\"esTypes\":[\"float\"],\"scripted\":false,\"searchable\":true,\"aggregatable\":true,\"readFromDocValues\":true},{\"count\":1,\"name\":\"trafficInsights.timeToFirstByte.currentExperience.serviceLocation\",\"type\":\"string\",\"esTypes\":[\"text\"],\"scripted\":false,\"searchable\":true,\"aggregatable\":false,\"readFromDocValues\":false},{\"count\":0,\"name\":\"trafficInsights.timeToFirstByte.currentExperience.serviceLocation.keyword\",\"type\":\"string\",\"esTypes\":[\"keyword\"],\"scripted\":false,\"searchable\":true,\"aggregatable\":true,\"readFromDocValues\":true,\"subType\":{\"multi\":{\"parent\":\"trafficInsights.timeToFirstByte.currentExperience.serviceLocation\"}}},{\"count\":1,\"name\":\"trafficInsights.timeToFirstByte.currentExperience.serviceName\",\"type\":\"string\",\"esTypes\":[\"text\"],\"scripted\":false,\"searchable\":true,\"aggregatable\":false,\"readFromDocValues\":false},{\"count\":0,\"name\":\"trafficInsights.timeToFirstByte.currentExperience.serviceName.keyword\",\"type\":\"string\",\"esTypes\":[\"keyword\"],\"scripted\":false,\"searchable\":true,\"aggregatable\":true,\"readFromDocValues\":true,\"subType\":{\"multi\":{\"parent\":\"trafficInsights.timeToFirstByte.currentExperience.serviceName\"}}},{\"count\":2,\"name\":\"trafficInsights.timeToFirstByte.currentExperience.value\",\"type\":\"number\",\"esTypes\":[\"long\"],\"scripted\":false,\"searchable\":true,\"aggregatable\":true,\"readFromDocValues\":true},{\"count\":1,\"name\":\"trafficInsights.timeToFirstByte.ec2.serviceLocation\",\"type\":\"string\",\"esTypes\":[\"text\"],\"scripted\":false,\"searchable\":true,\"aggregatable\":false,\"readFromDocValues\":false},{\"count\":0,\"name\":\"trafficInsights.timeToFirstByte.ec2.serviceLocation.keyword\",\"type\":\"string\",\"esTypes\":[\"keyword\"],\"scripted\":false,\"searchable\":true,\"aggregatable\":true,\"readFromDocValues\":true,\"subType\":{\"multi\":{\"parent\":\"trafficInsights.timeToFirstByte.ec2.serviceLocation\"}}},{\"count\":3,\"name\":\"trafficInsights.timeToFirstByte.ec2.serviceName\",\"type\":\"string\",\"esTypes\":[\"text\"],\"scripted\":false,\"searchable\":true,\"aggregatable\":false,\"readFromDocValues\":false},{\"count\":0,\"name\":\"trafficInsights.timeToFirstByte.ec2.serviceName.keyword\",\"type\":\"string\",\"esTypes\":[\"keyword\"],\"scripted\":false,\"searchable\":true,\"aggregatable\":true,\"readFromDocValues\":true,\"subType\":{\"multi\":{\"parent\":\"trafficInsights.timeToFirstByte.ec2.serviceName\"}}},{\"count\":1,\"name\":\"trafficInsights.timeToFirstByte.ec2.value\",\"type\":\"number\",\"esTypes\":[\"long\"],\"scripted\":false,\"searchable\":true,\"aggregatable\":true,\"readFromDocValues\":true},{\"count\":0,\"name\":\"version\",\"type\":\"number\",\"esTypes\":[\"integer\"],\"scripted\":false,\"searchable\":true,\"aggregatable\":true,\"readFromDocValues\":true}]","timeFieldName":"@timestamp","title":"cwl*"},"id":"5e0e6820-e063-11ed-969d-8b4100ed7c0d","migrationVersion":{"index-pattern":"7.6.0"},"references":[],"type":"index-pattern","updated_at":"2023-05-18T02:11:03.807Z","version":"WzExNSwxXQ=="} 2 | {"attributes":{"description":"","kibanaSavedObjectMeta":{"searchSourceJSON":"{\"query\":{\"language\":\"kuery\",\"query\":\"\"},\"filter\":[],\"indexRefName\":\"kibanaSavedObjectMeta.searchSourceJSON.index\"}"},"title":"TOP20-City-Latency","uiStateJSON":"{}","version":1,"visState":"{\"title\":\"TOP20-City-Latency\",\"type\":\"histogram\",\"aggs\":[{\"id\":\"1\",\"enabled\":true,\"type\":\"avg\",\"params\":{\"field\":\"internetHealth.performance.roundTripTime.p95\",\"customLabel\":\"performance.roundTripTime.p95(ms)\"},\"schema\":\"metric\"},{\"id\":\"2\",\"enabled\":true,\"type\":\"terms\",\"params\":{\"field\":\"clientLocation.city\",\"orderBy\":\"_key\",\"order\":\"desc\",\"size\":20,\"otherBucket\":false,\"otherBucketLabel\":\"Other\",\"missingBucket\":false,\"missingBucketLabel\":\"Missing\"},\"schema\":\"segment\"}],\"params\":{\"type\":\"histogram\",\"grid\":{\"categoryLines\":false},\"categoryAxes\":[{\"id\":\"CategoryAxis-1\",\"type\":\"category\",\"position\":\"bottom\",\"show\":true,\"style\":{},\"scale\":{\"type\":\"linear\"},\"labels\":{\"show\":true,\"filter\":true,\"truncate\":100},\"title\":{}}],\"valueAxes\":[{\"id\":\"ValueAxis-1\",\"name\":\"LeftAxis-1\",\"type\":\"value\",\"position\":\"left\",\"show\":true,\"style\":{},\"scale\":{\"type\":\"linear\",\"mode\":\"normal\"},\"labels\":{\"show\":true,\"rotate\":0,\"filter\":false,\"truncate\":100},\"title\":{\"text\":\"performance.roundTripTime.p95(ms)\"}}],\"seriesParams\":[{\"show\":true,\"type\":\"histogram\",\"mode\":\"stacked\",\"data\":{\"label\":\"performance.roundTripTime.p95(ms)\",\"id\":\"1\"},\"valueAxis\":\"ValueAxis-1\",\"drawLinesBetweenPoints\":true,\"lineWidth\":2,\"showCircles\":true}],\"addTooltip\":true,\"addLegend\":true,\"legendPosition\":\"right\",\"times\":[],\"addTimeMarker\":false,\"labels\":{\"show\":false},\"thresholdLine\":{\"show\":false,\"value\":10,\"width\":1,\"style\":\"full\",\"color\":\"#E7664C\"}}}"},"id":"04080620-ec10-11ed-969d-8b4100ed7c0d","migrationVersion":{"visualization":"7.10.0"},"references":[{"id":"5e0e6820-e063-11ed-969d-8b4100ed7c0d","name":"kibanaSavedObjectMeta.searchSourceJSON.index","type":"index-pattern"}],"type":"visualization","updated_at":"2023-05-06T13:15:04.961Z","version":"WzY4LDFd"} 3 | {"attributes":{"fields":"[{\"count\":0,\"name\":\"CHANGE\",\"type\":\"number\",\"esTypes\":[\"float\"],\"scripted\":false,\"searchable\":true,\"aggregatable\":true,\"readFromDocValues\":true},{\"count\":0,\"name\":\"PRICE\",\"type\":\"number\",\"esTypes\":[\"float\"],\"scripted\":false,\"searchable\":true,\"aggregatable\":true,\"readFromDocValues\":true},{\"count\":0,\"name\":\"SECTOR\",\"type\":\"string\",\"esTypes\":[\"text\"],\"scripted\":false,\"searchable\":true,\"aggregatable\":false,\"readFromDocValues\":false},{\"count\":0,\"name\":\"SECTOR.keyword\",\"type\":\"string\",\"esTypes\":[\"keyword\"],\"scripted\":false,\"searchable\":true,\"aggregatable\":true,\"readFromDocValues\":true,\"subType\":{\"multi\":{\"parent\":\"SECTOR\"}}},{\"count\":0,\"name\":\"TICKER_SYMBOL\",\"type\":\"string\",\"esTypes\":[\"text\"],\"scripted\":false,\"searchable\":true,\"aggregatable\":false,\"readFromDocValues\":false},{\"count\":0,\"name\":\"TICKER_SYMBOL.keyword\",\"type\":\"string\",\"esTypes\":[\"keyword\"],\"scripted\":false,\"searchable\":true,\"aggregatable\":true,\"readFromDocValues\":true,\"subType\":{\"multi\":{\"parent\":\"TICKER_SYMBOL\"}}},{\"count\":0,\"name\":\"_id\",\"type\":\"string\",\"esTypes\":[\"_id\"],\"scripted\":false,\"searchable\":true,\"aggregatable\":true,\"readFromDocValues\":false},{\"count\":0,\"name\":\"_index\",\"type\":\"string\",\"esTypes\":[\"_index\"],\"scripted\":false,\"searchable\":true,\"aggregatable\":true,\"readFromDocValues\":false},{\"count\":0,\"name\":\"_score\",\"type\":\"number\",\"scripted\":false,\"searchable\":false,\"aggregatable\":false,\"readFromDocValues\":false},{\"count\":0,\"name\":\"_source\",\"type\":\"_source\",\"esTypes\":[\"_source\"],\"scripted\":false,\"searchable\":false,\"aggregatable\":false,\"readFromDocValues\":false},{\"count\":0,\"name\":\"_type\",\"type\":\"string\",\"scripted\":false,\"searchable\":false,\"aggregatable\":false,\"readFromDocValues\":false},{\"count\":0,\"name\":\"bytesIn\",\"type\":\"number\",\"esTypes\":[\"long\"],\"scripted\":false,\"searchable\":true,\"aggregatable\":true,\"readFromDocValues\":true},{\"count\":0,\"name\":\"bytesOut\",\"type\":\"number\",\"esTypes\":[\"long\"],\"scripted\":false,\"searchable\":true,\"aggregatable\":true,\"readFromDocValues\":true},{\"count\":0,\"name\":\"clientConnectionCount\",\"type\":\"number\",\"esTypes\":[\"integer\"],\"scripted\":false,\"searchable\":true,\"aggregatable\":true,\"readFromDocValues\":true},{\"count\":0,\"name\":\"clientLocation.asn\",\"type\":\"number\",\"esTypes\":[\"integer\"],\"scripted\":false,\"searchable\":true,\"aggregatable\":true,\"readFromDocValues\":true},{\"count\":0,\"name\":\"clientLocation.city\",\"type\":\"string\",\"esTypes\":[\"keyword\"],\"scripted\":false,\"searchable\":true,\"aggregatable\":true,\"readFromDocValues\":true},{\"count\":0,\"name\":\"clientLocation.country\",\"type\":\"string\",\"esTypes\":[\"keyword\"],\"scripted\":false,\"searchable\":true,\"aggregatable\":true,\"readFromDocValues\":true},{\"count\":0,\"name\":\"clientLocation.countryCode\",\"type\":\"string\",\"esTypes\":[\"keyword\"],\"scripted\":false,\"searchable\":true,\"aggregatable\":true,\"readFromDocValues\":true},{\"count\":0,\"name\":\"clientLocation.latitude\",\"type\":\"number\",\"esTypes\":[\"float\"],\"scripted\":false,\"searchable\":true,\"aggregatable\":true,\"readFromDocValues\":true},{\"count\":0,\"name\":\"clientLocation.longitude\",\"type\":\"number\",\"esTypes\":[\"float\"],\"scripted\":false,\"searchable\":true,\"aggregatable\":true,\"readFromDocValues\":true},{\"count\":0,\"name\":\"clientLocation.metro\",\"type\":\"string\",\"esTypes\":[\"keyword\"],\"scripted\":false,\"searchable\":true,\"aggregatable\":true,\"readFromDocValues\":true},{\"count\":0,\"name\":\"clientLocation.networkName\",\"type\":\"string\",\"esTypes\":[\"keyword\"],\"scripted\":false,\"searchable\":true,\"aggregatable\":true,\"readFromDocValues\":true},{\"count\":0,\"name\":\"clientLocation.subdivision\",\"type\":\"string\",\"esTypes\":[\"keyword\"],\"scripted\":false,\"searchable\":true,\"aggregatable\":true,\"readFromDocValues\":true},{\"count\":0,\"name\":\"clientLocation.subdivisionCode\",\"type\":\"string\",\"esTypes\":[\"keyword\"],\"scripted\":false,\"searchable\":true,\"aggregatable\":true,\"readFromDocValues\":true},{\"count\":0,\"name\":\"internetHealth.availability.experienceScore\",\"type\":\"number\",\"esTypes\":[\"integer\"],\"scripted\":false,\"searchable\":true,\"aggregatable\":true,\"readFromDocValues\":true},{\"count\":0,\"name\":\"internetHealth.availability.percentageOfClientLocationImpacted\",\"type\":\"number\",\"esTypes\":[\"float\"],\"scripted\":false,\"searchable\":true,\"aggregatable\":true,\"readFromDocValues\":true},{\"count\":0,\"name\":\"internetHealth.availability.percentageOfTotalTrafficImpacted\",\"type\":\"number\",\"esTypes\":[\"float\"],\"scripted\":false,\"searchable\":true,\"aggregatable\":true,\"readFromDocValues\":true},{\"count\":0,\"name\":\"internetHealth.performance.experienceScore\",\"type\":\"number\",\"esTypes\":[\"integer\"],\"scripted\":false,\"searchable\":true,\"aggregatable\":true,\"readFromDocValues\":true},{\"count\":0,\"name\":\"internetHealth.performance.percentageOfClientLocationImpacted\",\"type\":\"number\",\"esTypes\":[\"float\"],\"scripted\":false,\"searchable\":true,\"aggregatable\":true,\"readFromDocValues\":true},{\"count\":0,\"name\":\"internetHealth.performance.percentageOfTotalTrafficImpacted\",\"type\":\"number\",\"esTypes\":[\"float\"],\"scripted\":false,\"searchable\":true,\"aggregatable\":true,\"readFromDocValues\":true},{\"count\":0,\"name\":\"internetHealth.performance.roundTripTime.p50\",\"type\":\"number\",\"esTypes\":[\"float\"],\"scripted\":false,\"searchable\":true,\"aggregatable\":true,\"readFromDocValues\":true},{\"count\":0,\"name\":\"internetHealth.performance.roundTripTime.p90\",\"type\":\"number\",\"esTypes\":[\"float\"],\"scripted\":false,\"searchable\":true,\"aggregatable\":true,\"readFromDocValues\":true},{\"count\":0,\"name\":\"internetHealth.performance.roundTripTime.p95\",\"type\":\"number\",\"esTypes\":[\"float\"],\"scripted\":false,\"searchable\":true,\"aggregatable\":true,\"readFromDocValues\":true},{\"count\":0,\"name\":\"percentageOfTotalTraffic\",\"type\":\"number\",\"esTypes\":[\"float\"],\"scripted\":false,\"searchable\":true,\"aggregatable\":true,\"readFromDocValues\":true},{\"count\":0,\"name\":\"serviceLocation\",\"type\":\"string\",\"esTypes\":[\"keyword\"],\"scripted\":false,\"searchable\":true,\"aggregatable\":true,\"readFromDocValues\":true},{\"count\":0,\"name\":\"timestamp\",\"type\":\"date\",\"esTypes\":[\"date\"],\"scripted\":false,\"searchable\":true,\"aggregatable\":true,\"readFromDocValues\":true},{\"count\":0,\"name\":\"version\",\"type\":\"number\",\"esTypes\":[\"integer\"],\"scripted\":false,\"searchable\":true,\"aggregatable\":true,\"readFromDocValues\":true}]","timeFieldName":"timestamp","title":"internet*"},"id":"060b5a20-e031-11ed-969d-8b4100ed7c0d","migrationVersion":{"index-pattern":"7.6.0"},"references":[],"type":"index-pattern","updated_at":"2023-04-21T10:41:07.777Z","version":"WzUsMV0="} 4 | {"attributes":{"buildNum":223231,"defaultIndex":"b8525d50-e004-11ed-969d-8b4100ed7c0d"},"id":"2.5.0","migrationVersion":{"config":"7.9.0"},"references":[],"type":"config","updated_at":"2023-04-21T05:24:40.164Z","version":"WzIsMV0="} 5 | {"attributes":{"description":"","kibanaSavedObjectMeta":{"searchSourceJSON":"{\"query\":{\"query\":\"\",\"language\":\"kuery\"},\"filter\":[]}"},"title":"controller","uiStateJSON":"{}","version":1,"visState":"{\"title\":\"controller\",\"type\":\"input_control_vis\",\"aggs\":[],\"params\":{\"controls\":[{\"id\":\"1684043415288\",\"fieldName\":\"clientLocation.country\",\"parent\":\"\",\"label\":\"国家\",\"type\":\"list\",\"options\":{\"type\":\"terms\",\"multiselect\":true,\"dynamicOptions\":true,\"size\":5,\"order\":\"desc\"},\"indexPatternRefName\":\"control_0_index_pattern\"},{\"id\":\"1684376702995\",\"fieldName\":\"clientLocation.city\",\"parent\":\"1684043415288\",\"label\":\"城市\",\"type\":\"list\",\"options\":{\"type\":\"terms\",\"multiselect\":true,\"dynamicOptions\":true,\"size\":5,\"order\":\"desc\"},\"indexPatternRefName\":\"control_1_index_pattern\"},{\"id\":\"1684376737658\",\"fieldName\":\"clientLocation.asn\",\"parent\":\"\",\"label\":\"ASN\",\"type\":\"list\",\"options\":{\"type\":\"terms\",\"multiselect\":true,\"dynamicOptions\":true,\"size\":5,\"order\":\"desc\"},\"indexPatternRefName\":\"control_2_index_pattern\"}],\"updateFiltersOnChange\":false,\"useTimeFilter\":false,\"pinFilters\":false}}"},"id":"623e08f0-f7d9-11ed-969d-8b4100ed7c0d","migrationVersion":{"visualization":"7.10.0"},"references":[{"id":"5e0e6820-e063-11ed-969d-8b4100ed7c0d","name":"control_0_index_pattern","type":"index-pattern"},{"id":"5e0e6820-e063-11ed-969d-8b4100ed7c0d","name":"control_1_index_pattern","type":"index-pattern"},{"id":"5e0e6820-e063-11ed-969d-8b4100ed7c0d","name":"control_2_index_pattern","type":"index-pattern"}],"type":"visualization","updated_at":"2023-05-21T13:14:14.655Z","version":"WzEzOSwxXQ=="} 6 | {"attributes":{"description":"","kibanaSavedObjectMeta":{"searchSourceJSON":"{\"query\":{\"language\":\"kuery\",\"query\":\"\"},\"filter\":[],\"indexRefName\":\"kibanaSavedObjectMeta.searchSourceJSON.index\"}"},"title":"Client-Map","uiStateJSON":"{\"mapCenter\":[32.7688004848817,47.89966972113759],\"mapZoom\":3}","version":1,"visState":"{\"title\":\"Client-Map\",\"type\":\"region_map\",\"aggs\":[{\"id\":\"1\",\"enabled\":true,\"type\":\"avg\",\"params\":{\"field\":\"internetHealth.availability.experienceScore\",\"customLabel\":\"体验分数\"},\"schema\":\"metric\"},{\"id\":\"2\",\"enabled\":true,\"type\":\"terms\",\"params\":{\"field\":\"clientLocation.countryCode\",\"orderBy\":\"1\",\"order\":\"asc\",\"size\":250,\"otherBucket\":true,\"otherBucketLabel\":\"Other\",\"missingBucket\":false,\"missingBucketLabel\":\"Missing\",\"customLabel\":\"国家代码\"},\"schema\":\"segment\"}],\"params\":{\"addTooltip\":true,\"colorSchema\":\"Greens\",\"emsHotLink\":\"?locale=en#file/world_countries\",\"isDisplayWarning\":false,\"layerChosenByUser\":\"default\",\"legendPosition\":\"bottomright\",\"mapCenter\":[0,0],\"mapZoom\":2,\"outlineWeight\":1,\"selectedCustomJoinField\":null,\"selectedJoinField\":{\"description\":\"ISO 3166-1 alpha-2 Code\",\"name\":\"iso2\",\"type\":\"id\"},\"selectedLayer\":{\"attribution\":\"Made with NaturalEarth\",\"created_at\":\"2017-04-26T17:12:15.978370\",\"fields\":[{\"description\":\"ISO 3166-1 alpha-2 Code\",\"name\":\"iso2\",\"type\":\"id\"},{\"description\":\"ISO 3166-1 alpha-3 Code\",\"name\":\"iso3\",\"type\":\"id\"},{\"description\":\"Name\",\"name\":\"name\",\"type\":\"name\"}],\"format\":{\"type\":\"geojson\"},\"id\":\"world_countries\",\"isEMS\":true,\"layerId\":\"elastic_maps_service.World Countries\",\"name\":\"World Countries\",\"origin\":\"elastic_maps_service\"},\"showAllShapes\":true,\"wms\":{\"enabled\":true,\"options\":{\"attribution\":\"\",\"format\":\"image/png\",\"layers\":\"\",\"styles\":\"\",\"transparent\":true,\"version\":\"\"},\"selectedTmsLayer\":{\"attribution\":\"Map data © OpenStreetMap contributors\",\"id\":\"road_map\",\"maxZoom\":14,\"minZoom\":0,\"origin\":\"elastic_maps_service\"},\"url\":\"http://webrd02.is.autonavi.com/appmaptile?lang=zh_cn&size=1&scale=1&style=7&x={x}&y={y}&z={z}\"}}}"},"id":"e0cebcf0-e064-11ed-9e32-9b382625f56b","migrationVersion":{"visualization":"7.10.0"},"references":[{"id":"5e0e6820-e063-11ed-969d-8b4100ed7c0d","name":"kibanaSavedObjectMeta.searchSourceJSON.index","type":"index-pattern"}],"type":"visualization","updated_at":"2023-05-14T06:10:33.191Z","version":"Wzg5LDFd"} 7 | {"attributes":{"description":"","kibanaSavedObjectMeta":{"searchSourceJSON":"{\"query\":{\"query\":\"\",\"language\":\"kuery\"},\"filter\":[],\"indexRefName\":\"kibanaSavedObjectMeta.searchSourceJSON.index\"}"},"title":"Client-Country","uiStateJSON":"{}","version":1,"visState":"{\"title\":\"Client-Country\",\"type\":\"pie\",\"aggs\":[{\"id\":\"1\",\"enabled\":true,\"type\":\"count\",\"params\":{},\"schema\":\"metric\"},{\"id\":\"2\",\"enabled\":true,\"type\":\"terms\",\"params\":{\"field\":\"clientLocation.country\",\"orderBy\":\"1\",\"order\":\"desc\",\"size\":10,\"otherBucket\":false,\"otherBucketLabel\":\"Other\",\"missingBucket\":false,\"missingBucketLabel\":\"Missing\",\"exclude\":\"Taiwan\",\"customLabel\":\"国家\"},\"schema\":\"segment\"}],\"params\":{\"type\":\"pie\",\"addTooltip\":true,\"addLegend\":true,\"legendPosition\":\"right\",\"isDonut\":true,\"labels\":{\"show\":true,\"values\":true,\"last_level\":true,\"truncate\":100}}}"},"id":"7c426ee0-e26b-11ed-969d-8b4100ed7c0d","migrationVersion":{"visualization":"7.10.0"},"references":[{"id":"5e0e6820-e063-11ed-969d-8b4100ed7c0d","name":"kibanaSavedObjectMeta.searchSourceJSON.index","type":"index-pattern"}],"type":"visualization","updated_at":"2023-05-14T05:38:26.816Z","version":"WzgwLDFd"} 8 | {"attributes":{"description":"","kibanaSavedObjectMeta":{"searchSourceJSON":"{\"query\":{\"language\":\"kuery\",\"query\":\"\"},\"filter\":[{\"$state\":{\"store\":\"appState\"},\"exists\":{\"field\":\"clientLocation.city\"},\"meta\":{\"alias\":null,\"disabled\":false,\"key\":\"clientLocation.city\",\"negate\":false,\"type\":\"exists\",\"value\":\"exists\",\"indexRefName\":\"kibanaSavedObjectMeta.searchSourceJSON.filter[0].meta.index\"}}],\"indexRefName\":\"kibanaSavedObjectMeta.searchSourceJSON.index\"}"},"title":"Client-City","uiStateJSON":"{}","version":1,"visState":"{\"title\":\"Client-City\",\"type\":\"histogram\",\"aggs\":[{\"id\":\"1\",\"enabled\":true,\"type\":\"count\",\"params\":{},\"schema\":\"metric\"},{\"id\":\"2\",\"enabled\":true,\"type\":\"terms\",\"params\":{\"field\":\"clientLocation.city\",\"orderBy\":\"1\",\"order\":\"desc\",\"size\":20,\"otherBucket\":false,\"otherBucketLabel\":\"Other\",\"missingBucket\":false,\"missingBucketLabel\":\"Missing\",\"customLabel\":\"Client-City\"},\"schema\":\"segment\"}],\"params\":{\"type\":\"histogram\",\"grid\":{\"categoryLines\":false},\"categoryAxes\":[{\"id\":\"CategoryAxis-1\",\"type\":\"category\",\"position\":\"bottom\",\"show\":true,\"style\":{},\"scale\":{\"type\":\"linear\"},\"labels\":{\"show\":true,\"filter\":true,\"truncate\":100},\"title\":{}}],\"valueAxes\":[{\"id\":\"ValueAxis-1\",\"name\":\"LeftAxis-1\",\"type\":\"value\",\"position\":\"left\",\"show\":true,\"style\":{},\"scale\":{\"type\":\"linear\",\"mode\":\"normal\"},\"labels\":{\"show\":true,\"rotate\":0,\"filter\":false,\"truncate\":100},\"title\":{\"text\":\"Count\"}}],\"seriesParams\":[{\"show\":true,\"type\":\"histogram\",\"mode\":\"stacked\",\"data\":{\"label\":\"Count\",\"id\":\"1\"},\"valueAxis\":\"ValueAxis-1\",\"drawLinesBetweenPoints\":true,\"lineWidth\":2,\"showCircles\":true}],\"addTooltip\":true,\"addLegend\":true,\"legendPosition\":\"right\",\"times\":[],\"addTimeMarker\":false,\"labels\":{\"show\":false},\"thresholdLine\":{\"show\":false,\"value\":10,\"width\":1,\"style\":\"full\",\"color\":\"#E7664C\"}}}"},"id":"a9465500-e0b3-11ed-9e32-9b382625f56b","migrationVersion":{"visualization":"7.10.0"},"references":[{"id":"5e0e6820-e063-11ed-969d-8b4100ed7c0d","name":"kibanaSavedObjectMeta.searchSourceJSON.index","type":"index-pattern"},{"id":"5e0e6820-e063-11ed-969d-8b4100ed7c0d","name":"kibanaSavedObjectMeta.searchSourceJSON.filter[0].meta.index","type":"index-pattern"}],"type":"visualization","updated_at":"2023-04-22T02:16:16.207Z","version":"WzI0LDFd"} 9 | {"attributes":{"description":"","kibanaSavedObjectMeta":{"searchSourceJSON":"{\"query\":{\"language\":\"kuery\",\"query\":\"\"},\"filter\":[],\"indexRefName\":\"kibanaSavedObjectMeta.searchSourceJSON.index\"}"},"title":"TOP100-City-Latency-P50","uiStateJSON":"{}","version":1,"visState":"{\"title\":\"TOP100-City-Latency-P50\",\"type\":\"histogram\",\"aggs\":[{\"id\":\"1\",\"enabled\":true,\"type\":\"avg\",\"params\":{\"field\":\"internetHealth.performance.roundTripTime.p50\"},\"schema\":\"metric\"},{\"id\":\"2\",\"enabled\":true,\"type\":\"terms\",\"params\":{\"field\":\"clientLocation.country\",\"orderBy\":\"custom\",\"orderAgg\":{\"id\":\"2-orderAgg\",\"enabled\":true,\"type\":\"avg\",\"params\":{\"field\":\"internetHealth.performance.roundTripTime.p95\"},\"schema\":\"orderAgg\"},\"order\":\"desc\",\"size\":100,\"otherBucket\":false,\"otherBucketLabel\":\"Other\",\"missingBucket\":false,\"missingBucketLabel\":\"Missing\"},\"schema\":\"segment\"}],\"params\":{\"type\":\"histogram\",\"grid\":{\"categoryLines\":false},\"categoryAxes\":[{\"id\":\"CategoryAxis-1\",\"type\":\"category\",\"position\":\"bottom\",\"show\":true,\"style\":{},\"scale\":{\"type\":\"linear\"},\"labels\":{\"show\":true,\"filter\":true,\"truncate\":100},\"title\":{}}],\"valueAxes\":[{\"id\":\"ValueAxis-1\",\"name\":\"LeftAxis-1\",\"type\":\"value\",\"position\":\"left\",\"show\":true,\"style\":{},\"scale\":{\"type\":\"linear\",\"mode\":\"normal\"},\"labels\":{\"show\":true,\"rotate\":0,\"filter\":false,\"truncate\":100},\"title\":{\"text\":\"Average internetHealth.performance.roundTripTime.p50\"}}],\"seriesParams\":[{\"show\":true,\"type\":\"histogram\",\"mode\":\"stacked\",\"data\":{\"label\":\"Average internetHealth.performance.roundTripTime.p50\",\"id\":\"1\"},\"valueAxis\":\"ValueAxis-1\",\"drawLinesBetweenPoints\":true,\"lineWidth\":2,\"showCircles\":true}],\"addTooltip\":true,\"addLegend\":true,\"legendPosition\":\"right\",\"times\":[],\"addTimeMarker\":false,\"labels\":{\"show\":false},\"thresholdLine\":{\"show\":false,\"value\":10,\"width\":1,\"style\":\"full\",\"color\":\"#E7664C\"}}}"},"id":"a80fdb60-ea78-11ed-9e32-9b382625f56b","migrationVersion":{"visualization":"7.10.0"},"references":[{"id":"5e0e6820-e063-11ed-969d-8b4100ed7c0d","name":"kibanaSavedObjectMeta.searchSourceJSON.index","type":"index-pattern"}],"type":"visualization","updated_at":"2023-05-14T05:44:30.191Z","version":"WzgxLDFd"} 10 | {"attributes":{"description":"","kibanaSavedObjectMeta":{"searchSourceJSON":"{\"query\":{\"query\":\"\",\"language\":\"kuery\"},\"filter\":[]}"},"title":"Source and Destination Sankey Chart","uiStateJSON":"{}","version":1,"visState":"{\"title\":\"Source and Destination Sankey Chart\",\"type\":\"vega\",\"aggs\":[],\"params\":{\"spec\":\"{ \\n $schema: https://vega.github.io/schema/vega/v5.json\\n data: [\\n\\t{\\n \\t// query OpenSearch based on the currently selected time range and filter string\\n \\tname: rawData\\n \\turl: {\\n \\t%context%: true\\n \\t%timefield%: timestamp\\n \\tindex: cwl*\\n \\tbody: {\\n \\tsize: 0\\n \\taggs: {\\n \\ttable: {\\n \\tcomposite: {\\n \\tsize: 10000\\n \\tsources: [\\n \\t{\\n \\tstk1: {\\n \\tterms: {field: \\\"clientLocation.countryCode\\\"}\\n \\t}\\n \\t}\\n \\t{\\n \\tstk2: {\\n \\tterms: {field: \\\"serviceLocation\\\"}\\n \\t}\\n \\t}\\n \\t]\\n \\t}\\n \\t}\\n \\t}\\n \\t}\\n \\t}\\n \\t// From the result, take just the data we are interested in\\n \\tformat: {property: \\\"aggregations.table.buckets\\\"}\\n \\t// Convert key.stk1 -> stk1 for simpler access below\\n \\ttransform: [\\n \\t{type: \\\"formula\\\", expr: \\\"datum.key.stk1\\\", as: \\\"stk1\\\"}\\n \\t{type: \\\"formula\\\", expr: \\\"datum.key.stk2\\\", as: \\\"stk2\\\"}\\n \\t{type: \\\"formula\\\", expr: \\\"datum.doc_count\\\", as: \\\"size\\\"}\\n \\t]\\n\\t}\\n\\t{\\n \\tname: nodes\\n \\tsource: rawData\\n \\ttransform: [\\n \\t// when a country is selected, filter out unrelated data\\n \\t{\\n \\ttype: filter\\n \\texpr: !groupSelector || groupSelector.stk1 == datum.stk1 || groupSelector.stk2 == datum.stk2\\n \\t}\\n \\t// Set new key for later lookups - identifies each node\\n \\t{type: \\\"formula\\\", expr: \\\"datum.stk1+datum.stk2\\\", as: \\\"key\\\"}\\n \\t// instead of each table row, create two new rows,\\n \\t// one for the source (stack=stk1) and one for destination node (stack=stk2).\\n \\t// The country code stored in stk1 and stk2 fields is placed into grpId field.\\n \\t{\\n \\ttype: fold\\n \\tfields: [\\\"stk1\\\", \\\"stk2\\\"]\\n \\tas: [\\\"stack\\\", \\\"grpId\\\"]\\n \\t}\\n \\t// Create a sortkey, different for stk1 and stk2 stacks.\\n \\t{\\n \\ttype: formula\\n \\texpr: datum.stack == 'stk1' ? datum.stk1+datum.stk2 : datum.stk2+datum.stk1\\n \\tas: sortField\\n \\t}\\n \\t// Calculate y0 and y1 positions for stacking nodes one on top of the other,\\n \\t// independently for each stack, and ensuring they are in the proper order,\\n \\t// alphabetical from the top (reversed on the y axis)\\n \\t{\\n \\ttype: stack\\n \\tgroupby: [\\\"stack\\\"]\\n \\tsort: {field: \\\"sortField\\\", order: \\\"descending\\\"}\\n \\tfield: size\\n \\t}\\n \\t// calculate vertical center point for each node, used to draw edges\\n \\t{type: \\\"formula\\\", expr: \\\"(datum.y0+datum.y1)/2\\\", as: \\\"yc\\\"}\\n \\t]\\n\\t}\\n\\t{\\n \\tname: groups\\n \\tsource: nodes\\n \\ttransform: [\\n \\t// combine all nodes into country groups, summing up the doc counts\\n \\t{\\n \\ttype: aggregate\\n \\tgroupby: [\\\"stack\\\", \\\"grpId\\\"]\\n \\tfields: [\\\"size\\\"]\\n \\tops: [\\\"sum\\\"]\\n \\tas: [\\\"total\\\"]\\n \\t}\\n \\t// re-calculate the stacking y0,y1 values\\n \\t{\\n \\ttype: stack\\n \\tgroupby: [\\\"stack\\\"]\\n \\tsort: {field: \\\"grpId\\\", order: \\\"descending\\\"}\\n \\tfield: total\\n \\t}\\n \\t// project y0 and y1 values to screen coordinates\\n \\t// doing it once here instead of doing it several times in marks\\n \\t{type: \\\"formula\\\", expr: \\\"scale('y', datum.y0)\\\", as: \\\"scaledY0\\\"}\\n \\t{type: \\\"formula\\\", expr: \\\"scale('y', datum.y1)\\\", as: \\\"scaledY1\\\"}\\n \\t// boolean flag if the label should be on the right of the stack\\n \\t{type: \\\"formula\\\", expr: \\\"datum.stack == 'stk1'\\\", as: \\\"rightLabel\\\"}\\n \\t// Calculate traffic percentage for this country using \\\"y\\\" scale\\n \\t// domain upper bound, which represents the total traffic\\n \\t{\\n \\ttype: formula\\n \\texpr: datum.total/domain('y')[1]\\n \\tas: percentage\\n \\t}\\n \\t]\\n\\t}\\n\\t{\\n \\t// This is a temp lookup table with all the 'stk2' stack nodes\\n \\tname: destinationNodes\\n \\tsource: nodes\\n \\ttransform: [\\n \\t{type: \\\"filter\\\", expr: \\\"datum.stack == 'stk2'\\\"}\\n \\t]\\n\\t}\\n\\t{\\n \\tname: edges\\n \\tsource: nodes\\n \\ttransform: [\\n \\t// we only want nodes from the left stack\\n \\t{type: \\\"filter\\\", expr: \\\"datum.stack == 'stk1'\\\"}\\n \\t// find corresponding node from the right stack, keep it as \\\"target\\\"\\n \\t{\\n \\ttype: lookup\\n \\tfrom: destinationNodes\\n \\tkey: key\\n \\tfields: [\\\"key\\\"]\\n \\tas: [\\\"target\\\"]\\n \\t}\\n \\t// calculate SVG link path between stk1 and stk2 stacks for the node pair\\n \\t{\\n \\ttype: linkpath\\n \\torient: horizontal\\n \\tshape: diagonal\\n \\tsourceY: {expr: \\\"scale('y', datum.yc)\\\"}\\n \\tsourceX: {expr: \\\"scale('x', 'stk1') + bandwidth('x')\\\"}\\n \\ttargetY: {expr: \\\"scale('y', datum.target.yc)\\\"}\\n \\ttargetX: {expr: \\\"scale('x', 'stk2')\\\"}\\n \\t}\\n \\t// A little trick to calculate the thickness of the line.\\n \\t// The value needs to be the same as the hight of the node, but scaling\\n \\t// size to screen's height gives inversed value because screen's Y\\n \\t// coordinate goes from the top to the bottom, whereas the graph's Y=0\\n \\t// is at the bottom. So subtracting scaled doc count from screen height\\n \\t// (which is the \\\"lower\\\" bound of the \\\"y\\\" scale) gives us the right value\\n \\t{\\n \\ttype: formula\\n \\texpr: range('y')[0]-scale('y', datum.size)\\n \\tas: strokeWidth\\n \\t}\\n \\t// Tooltip needs individual link's percentage of all traffic\\n \\t{\\n \\ttype: formula\\n \\texpr: datum.size/domain('y')[1]\\n \\tas: percentage\\n \\t}\\n \\t]\\n\\t}\\n ]\\n scales: [\\n\\t{\\n \\t// calculates horizontal stack positioning\\n \\tname: x\\n \\ttype: band\\n \\trange: width\\n \\tdomain: [\\\"stk1\\\", \\\"stk2\\\"]\\n \\tpaddingOuter: 0.05\\n \\tpaddingInner: 0.95\\n\\t}\\n\\t{\\n \\t// this scale goes up as high as the highest y1 value of all nodes\\n \\tname: y\\n \\ttype: linear\\n \\trange: height\\n \\tdomain: {data: \\\"nodes\\\", field: \\\"y1\\\"}\\n\\t}\\n\\t{\\n \\t// use rawData to ensure the colors stay the same when clicking.\\n \\tname: color\\n \\ttype: ordinal\\n \\trange: category\\n \\tdomain: {data: \\\"rawData\\\", field: \\\"stk1\\\"}\\n\\t}\\n\\t{\\n \\t// this scale is used to map internal ids (stk1, stk2) to stack names\\n \\tname: stackNames\\n \\ttype: ordinal\\n \\trange: [\\\"Source\\\", \\\"Destination\\\"]\\n \\tdomain: [\\\"stk1\\\", \\\"stk2\\\"]\\n\\t}\\n ]\\n axes: [\\n\\t{\\n \\t// x axis should use custom label formatting to print proper stack names\\n \\torient: bottom\\n \\tscale: x\\n \\tencode: {\\n \\tlabels: {\\n \\tupdate: {\\n \\ttext: {scale: \\\"stackNames\\\", field: \\\"value\\\"}\\n \\t}\\n \\t}\\n \\t}\\n\\t}\\n\\t{orient: \\\"left\\\", scale: \\\"y\\\"}\\n ]\\n marks: [\\n\\t{\\n \\t// draw the connecting line between stacks\\n \\ttype: path\\n \\tname: edgeMark\\n \\tfrom: {data: \\\"edges\\\"}\\n \\t// this prevents some autosizing issues with large strokeWidth for paths\\n \\tclip: true\\n \\tencode: {\\n \\tupdate: {\\n \\t// By default use color of the left node, except when showing traffic\\n \\t// from just one country, in which case use destination color.\\n \\tstroke: [\\n \\t{\\n \\ttest: groupSelector && groupSelector.stack=='stk1'\\n \\tscale: color\\n \\tfield: stk2\\n \\t}\\n \\t{scale: \\\"color\\\", field: \\\"stk1\\\"}\\n \\t]\\n \\tstrokeWidth: {field: \\\"strokeWidth\\\"}\\n \\tpath: {field: \\\"path\\\"}\\n \\t// when showing all traffic, and hovering over a country,\\n \\t// highlight the traffic from that country.\\n \\tstrokeOpacity: {\\n \\tsignal: !groupSelector && (groupHover.stk1 == datum.stk1 || groupHover.stk2 == datum.stk2) ? 0.9 : 0.3\\n \\t}\\n \\t// Ensure that the hover-selected edges show on top\\n \\tzindex: {\\n \\tsignal: !groupSelector && (groupHover.stk1 == datum.stk1 || groupHover.stk2 == datum.stk2) ? 1 : 0\\n \\t}\\n \\t// format tooltip string\\n \\ttooltip: {\\n \\tsignal: datum.stk1 + ' → ' + datum.stk2 + '\\t' + format(datum.size, ',.0f') + ' (' + format(datum.percentage, '.1%') + ')'\\n \\t}\\n \\t}\\n \\t// Simple mouseover highlighting of a single line\\n \\thover: {\\n \\tstrokeOpacity: {value: 1}\\n \\t}\\n \\t}\\n\\t}\\n\\t{\\n \\t// draw stack groups (countries)\\n \\ttype: rect\\n \\tname: groupMark\\n \\tfrom: {data: \\\"groups\\\"}\\n \\tencode: {\\n \\tenter: {\\n \\tfill: {scale: \\\"color\\\", field: \\\"grpId\\\"}\\n \\twidth: {scale: \\\"x\\\", band: 1}\\n \\t}\\n \\tupdate: {\\n \\tx: {scale: \\\"x\\\", field: \\\"stack\\\"}\\n \\ty: {field: \\\"scaledY0\\\"}\\n \\ty2: {field: \\\"scaledY1\\\"}\\n \\tfillOpacity: {value: 0.6}\\n \\ttooltip: {\\n \\tsignal: datum.grpId + ' ' + format(datum.total, ',.0f') + ' (' + format(datum.percentage, '.1%') + ')'\\n \\t}\\n \\t}\\n \\thover: {\\n \\tfillOpacity: {value: 1}\\n \\t}\\n \\t}\\n\\t}\\n\\t{\\n \\t// draw country code labels on the inner side of the stack\\n \\ttype: text\\n \\tfrom: {data: \\\"groups\\\"}\\n \\t// don't process events for the labels - otherwise line mouseover is unclean\\n \\tinteractive: false\\n \\tencode: {\\n \\tupdate: {\\n \\t// depending on which stack it is, position x with some padding\\n \\tx: {\\n \\tsignal: scale('x', datum.stack) + (datum.rightLabel ? bandwidth('x') + 8 : -8)\\n \\t}\\n \\t// middle of the group\\n \\tyc: {signal: \\\"(datum.scaledY0 + datum.scaledY1)/2\\\"}\\n \\talign: {signal: \\\"datum.rightLabel ? 'left' : 'right'\\\"}\\n \\tbaseline: {value: \\\"middle\\\"}\\n \\tfontWeight: {value: \\\"bold\\\"}\\n \\t// only show text label if the group's height is large enough\\n \\ttext: {signal: \\\"abs(datum.scaledY0-datum.scaledY1) > 13 ? datum.grpId : ''\\\"}\\n \\t}\\n \\t}\\n\\t}\\n\\t{\\n \\t// Create a \\\"show all\\\" button. Shown only when a country is selected.\\n \\ttype: group\\n \\tdata: [\\n \\t// We need to make the button show only when groupSelector signal is true.\\n \\t// Each mark is drawn as many times as there are elements in the backing data.\\n \\t// Which means that if values list is empty, it will not be drawn.\\n \\t// Here I create a data source with one empty object, and filter that list\\n \\t// based on the signal value. This can only be done in a group.\\n \\t{\\n \\tname: dataForShowAll\\n \\tvalues: [{}]\\n \\ttransform: [{type: \\\"filter\\\", expr: \\\"groupSelector\\\"}]\\n \\t}\\n \\t]\\n \\t// Set button size and positioning\\n \\tencode: {\\n \\tenter: {\\n \\txc: {signal: \\\"width/2\\\"}\\n \\ty: {value: 30}\\n \\twidth: {value: 80}\\n \\theight: {value: 30}\\n \\t}\\n \\t}\\n \\tmarks: [\\n \\t{\\n \\t// This group is shown as a button with rounded corners.\\n \\ttype: group\\n \\t// mark name allows signal capturing\\n \\tname: groupReset\\n \\t// Only shows button if dataForShowAll has values.\\n \\tfrom: {data: \\\"dataForShowAll\\\"}\\n \\tencode: {\\n \\tenter: {\\n \\tcornerRadius: {value: 6}\\n \\tfill: {value: \\\"#F5F7FA\\\"}\\n \\tstroke: {value: \\\"#c1c1c1\\\"}\\n \\tstrokeWidth: {value: 2}\\n \\t// use parent group's size\\n \\theight: {\\n \\tfield: {group: \\\"height\\\"}\\n \\t}\\n \\twidth: {\\n \\tfield: {group: \\\"width\\\"}\\n \\t}\\n \\t}\\n \\tupdate: {\\n \\t// groups are transparent by default\\n \\topacity: {value: 1}\\n \\t}\\n \\thover: {\\n \\topacity: {value: 0.7}\\n \\t}\\n \\t}\\n \\tmarks: [\\n \\t{\\n \\ttype: text\\n \\t// if true, it will prevent clicking on the button when over text.\\n \\tinteractive: false\\n \\tencode: {\\n \\tenter: {\\n \\t// center text in the paren group\\n \\txc: {\\n \\tfield: {group: \\\"width\\\"}\\n \\tmult: 0.5\\n \\t}\\n \\tyc: {\\n \\tfield: {group: \\\"height\\\"}\\n \\tmult: 0.5\\n \\toffset: 2\\n \\t}\\n \\talign: {value: \\\"center\\\"}\\n \\tbaseline: {value: \\\"middle\\\"}\\n \\tfontWeight: {value: \\\"bold\\\"}\\n \\ttext: {value: \\\"Show All\\\"}\\n \\t}\\n \\t}\\n \\t}\\n \\t]\\n \\t}\\n \\t]\\n\\t}\\n ]\\n signals: [\\n\\t{\\n \\t// used to highlight traffic to/from the same country\\n \\tname: groupHover\\n \\tvalue: {}\\n \\ton: [\\n \\t{\\n \\tevents: @groupMark:mouseover\\n \\tupdate: \\\"{stk1:datum.stack=='stk1' && datum.grpId, stk2:datum.stack=='stk2' && datum.grpId}\\\"\\n \\t}\\n \\t{events: \\\"mouseout\\\", update: \\\"{}\\\"}\\n \\t]\\n\\t}\\n\\t// used to filter only the data related to the selected country\\n\\t{\\n \\tname: groupSelector\\n \\tvalue: false\\n \\ton: [\\n \\t{\\n \\t// Clicking groupMark sets this signal to the filter values\\n \\tevents: @groupMark:click!\\n \\tupdate: \\\"{stack:datum.stack, stk1:datum.stack=='stk1' && datum.grpId, stk2:datum.stack=='stk2' && datum.grpId}\\\"\\n \\t}\\n \\t{\\n \\t// Clicking \\\"show all\\\" button, or double-clicking anywhere resets it\\n \\tevents: [\\n \\t{type: \\\"click\\\", markname: \\\"groupReset\\\"}\\n \\t{type: \\\"dblclick\\\"}\\n \\t]\\n \\tupdate: \\\"false\\\"\\n \\t}\\n \\t]\\n\\t}\\n ]\\n}\\n\"}}"},"id":"d722cf20-f7d9-11ed-9e32-9b382625f56b","migrationVersion":{"visualization":"7.10.0"},"references":[],"type":"visualization","updated_at":"2023-05-21T13:25:38.871Z","version":"WzE1NywxXQ=="} 11 | {"attributes":{"description":"","kibanaSavedObjectMeta":{"searchSourceJSON":"{\"query\":{\"query\":\"\",\"language\":\"kuery\"},\"filter\":[],\"indexRefName\":\"kibanaSavedObjectMeta.searchSourceJSON.index\"}"},"title":"Timestamp","uiStateJSON":"{}","version":1,"visState":"{\"title\":\"Timestamp\",\"type\":\"table\",\"aggs\":[{\"id\":\"1\",\"enabled\":true,\"type\":\"cardinality\",\"params\":{\"field\":\"clientLocation.country\",\"customLabel\":\"Country\"},\"schema\":\"metric\"},{\"id\":\"2\",\"enabled\":true,\"type\":\"cardinality\",\"params\":{\"field\":\"clientLocation.countryCode\",\"customLabel\":\"CountryCode\"},\"schema\":\"metric\"},{\"id\":\"3\",\"enabled\":true,\"type\":\"cardinality\",\"params\":{\"field\":\"clientLocation.city\",\"customLabel\":\"City\"},\"schema\":\"metric\"},{\"id\":\"4\",\"enabled\":true,\"type\":\"cardinality\",\"params\":{\"field\":\"clientLocation.asn\",\"customLabel\":\"ASN\"},\"schema\":\"metric\"}],\"params\":{\"perPage\":10,\"showPartialRows\":false,\"showMetricsAtAllLevels\":false,\"showTotal\":false,\"totalFunc\":\"sum\",\"percentageCol\":\"\",\"row\":true}}"},"id":"5b2a6590-e064-11ed-969d-8b4100ed7c0d","migrationVersion":{"visualization":"7.10.0"},"references":[{"id":"5e0e6820-e063-11ed-969d-8b4100ed7c0d","name":"kibanaSavedObjectMeta.searchSourceJSON.index","type":"index-pattern"}],"type":"visualization","updated_at":"2023-05-18T02:41:18.105Z","version":"WzEyMiwxXQ=="} 12 | {"attributes":{"description":"","kibanaSavedObjectMeta":{"searchSourceJSON":"{\"query\":{\"language\":\"kuery\",\"query\":\"\"},\"filter\":[],\"indexRefName\":\"kibanaSavedObjectMeta.searchSourceJSON.index\"}"},"title":"P90 Performance Score - RoundTripTime- Line","uiStateJSON":"{}","version":1,"visState":"{\"title\":\"P90 Performance Score - RoundTripTime- Line\",\"type\":\"line\",\"aggs\":[{\"id\":\"1\",\"enabled\":true,\"type\":\"avg\",\"params\":{\"field\":\"internetHealth.performance.roundTripTime.p90\",\"customLabel\":\"P90 性能得分(RoundTripTime)\"},\"schema\":\"metric\"},{\"id\":\"2\",\"enabled\":true,\"type\":\"date_histogram\",\"params\":{\"field\":\"@timestamp\",\"timeRange\":{\"from\":\"now-7d\",\"to\":\"now\"},\"useNormalizedOpenSearchInterval\":true,\"scaleMetricValues\":false,\"interval\":\"auto\",\"drop_partials\":false,\"min_doc_count\":1,\"extended_bounds\":{}},\"schema\":\"segment\"},{\"id\":\"3\",\"enabled\":true,\"type\":\"terms\",\"params\":{\"field\":\"clientLocation.city\",\"orderBy\":\"1\",\"order\":\"desc\",\"size\":20,\"otherBucket\":false,\"otherBucketLabel\":\"Other\",\"missingBucket\":false,\"missingBucketLabel\":\"Missing\"},\"schema\":\"group\"}],\"params\":{\"addLegend\":true,\"addTimeMarker\":false,\"addTooltip\":true,\"categoryAxes\":[{\"id\":\"CategoryAxis-1\",\"labels\":{\"filter\":true,\"show\":true,\"truncate\":100},\"position\":\"bottom\",\"scale\":{\"type\":\"linear\"},\"show\":true,\"style\":{},\"title\":{},\"type\":\"category\"}],\"grid\":{\"categoryLines\":false},\"labels\":{},\"legendPosition\":\"right\",\"seriesParams\":[{\"data\":{\"id\":\"1\",\"label\":\"P90 性能得分(RoundTripTime)\"},\"drawLinesBetweenPoints\":true,\"interpolate\":\"linear\",\"lineWidth\":2,\"mode\":\"normal\",\"show\":true,\"showCircles\":true,\"type\":\"line\",\"valueAxis\":\"ValueAxis-1\"}],\"thresholdLine\":{\"color\":\"#E7664C\",\"show\":false,\"style\":\"full\",\"value\":10,\"width\":1},\"times\":[],\"type\":\"line\",\"valueAxes\":[{\"id\":\"ValueAxis-1\",\"labels\":{\"filter\":false,\"rotate\":0,\"show\":true,\"truncate\":100},\"name\":\"LeftAxis-1\",\"position\":\"left\",\"scale\":{\"mode\":\"normal\",\"type\":\"linear\"},\"show\":true,\"style\":{},\"title\":{\"text\":\"P90 性能得分(RoundTripTime)\"},\"type\":\"value\"}]}}"},"id":"9e042b80-f522-11ed-9e32-9b382625f56b","migrationVersion":{"visualization":"7.10.0"},"references":[{"id":"5e0e6820-e063-11ed-969d-8b4100ed7c0d","name":"kibanaSavedObjectMeta.searchSourceJSON.index","type":"index-pattern"}],"type":"visualization","updated_at":"2023-05-18T02:33:56.238Z","version":"WzEyMSwxXQ=="} 13 | {"attributes":{"columns":["clientLocation.city","serviceLocation","clientLocation.asn","internetHealth.performance.roundTripTime.p95","internetHealth.performance.experienceScore"],"description":"","hits":0,"kibanaSavedObjectMeta":{"searchSourceJSON":"{\"highlightAll\":true,\"version\":true,\"query\":{\"query\":\"\",\"language\":\"kuery\"},\"filter\":[],\"indexRefName\":\"kibanaSavedObjectMeta.searchSourceJSON.index\"}"},"sort":[],"title":"IM-Log-Discover","version":1},"id":"e062a780-f456-11ed-969d-8b4100ed7c0d","migrationVersion":{"search":"7.9.3"},"references":[{"id":"5e0e6820-e063-11ed-969d-8b4100ed7c0d","name":"kibanaSavedObjectMeta.searchSourceJSON.index","type":"index-pattern"}],"type":"search","updated_at":"2023-05-18T02:07:51.410Z","version":"WzExMiwxXQ=="} 14 | {"attributes":{"description":"","hits":0,"kibanaSavedObjectMeta":{"searchSourceJSON":"{\"query\":{\"language\":\"kuery\",\"query\":\"\"},\"filter\":[]}"},"optionsJSON":"{\"hidePanelTitles\":false,\"useMargins\":true}","panelsJSON":"[{\"version\":\"2.5.0\",\"gridData\":{\"h\":7,\"i\":\"885fb81e-916f-4c91-a846-4ddec6b4f1ef\",\"w\":46,\"x\":1,\"y\":0},\"panelIndex\":\"885fb81e-916f-4c91-a846-4ddec6b4f1ef\",\"embeddableConfig\":{},\"panelRefName\":\"panel_0\"},{\"version\":\"2.5.0\",\"gridData\":{\"h\":16,\"i\":\"f488d599-2864-49bc-afe8-6f39536e4f01\",\"w\":46,\"x\":1,\"y\":7},\"panelIndex\":\"f488d599-2864-49bc-afe8-6f39536e4f01\",\"embeddableConfig\":{\"title\":\"客户体验分数-世界地图\",\"hidePanelTitles\":false,\"mapCenter\":null,\"mapZoom\":null},\"title\":\"客户体验分数-世界地图\",\"panelRefName\":\"panel_1\"},{\"version\":\"2.5.0\",\"gridData\":{\"h\":15,\"i\":\"810244e6-8fa2-42fe-8f4e-a461cd798eb1\",\"w\":21,\"x\":1,\"y\":23},\"panelIndex\":\"810244e6-8fa2-42fe-8f4e-a461cd798eb1\",\"embeddableConfig\":{\"title\":\"访客-国家统计\",\"hidePanelTitles\":false},\"title\":\"访客-国家统计\",\"panelRefName\":\"panel_2\"},{\"version\":\"2.5.0\",\"gridData\":{\"h\":15,\"i\":\"7e86c1b7-15ae-4b5c-90dd-3029393b9a70\",\"w\":25,\"x\":22,\"y\":23},\"panelIndex\":\"7e86c1b7-15ae-4b5c-90dd-3029393b9a70\",\"embeddableConfig\":{\"title\":\"访客-城市统计\",\"hidePanelTitles\":false},\"title\":\"访客-城市统计\",\"panelRefName\":\"panel_3\"},{\"version\":\"2.5.0\",\"gridData\":{\"h\":21,\"i\":\"50fe0d16-f9fc-48b0-a0f2-700e54f854f4\",\"w\":46,\"x\":1,\"y\":38},\"panelIndex\":\"50fe0d16-f9fc-48b0-a0f2-700e54f854f4\",\"embeddableConfig\":{\"title\":\"前100城市性能得分统计 - P50\",\"hidePanelTitles\":false},\"title\":\"前100城市性能得分统计 - P50\",\"panelRefName\":\"panel_4\"},{\"version\":\"2.5.0\",\"gridData\":{\"h\":15,\"i\":\"2529b3b7-b17e-4429-b424-4479bb3a69a1\",\"w\":24,\"x\":1,\"y\":59},\"panelIndex\":\"2529b3b7-b17e-4429-b424-4479bb3a69a1\",\"embeddableConfig\":{\"title\":\"源与服务区域 Sankey 图\",\"hidePanelTitles\":false},\"title\":\"源与服务区域 Sankey 图\",\"panelRefName\":\"panel_5\"},{\"version\":\"2.5.0\",\"gridData\":{\"h\":15,\"i\":\"f392e799-b44b-4aa3-94cc-8058827e65ca\",\"w\":22,\"x\":25,\"y\":59},\"panelIndex\":\"f392e799-b44b-4aa3-94cc-8058827e65ca\",\"embeddableConfig\":{\"title\":\"国家城市ASN数量统计\",\"hidePanelTitles\":false},\"title\":\"国家城市ASN数量统计\",\"panelRefName\":\"panel_6\"},{\"version\":\"2.5.0\",\"gridData\":{\"h\":17,\"i\":\"08eeeea9-4ef9-44d3-b7f0-ae9ff6dd96c9\",\"w\":47,\"x\":0,\"y\":74},\"panelIndex\":\"08eeeea9-4ef9-44d3-b7f0-ae9ff6dd96c9\",\"embeddableConfig\":{\"title\":\"P90 性能得分线图 RoundTripTime - 城市维度-前20最高时延\",\"hidePanelTitles\":false},\"title\":\"P90 性能得分线图 RoundTripTime - 城市维度-前20最高时延\",\"panelRefName\":\"panel_7\"},{\"version\":\"2.5.0\",\"gridData\":{\"h\":12,\"i\":\"29d964ab-c359-4ab1-a685-b0afbab3487c\",\"w\":47,\"x\":0,\"y\":91},\"panelIndex\":\"29d964ab-c359-4ab1-a685-b0afbab3487c\",\"embeddableConfig\":{\"title\":\"Mini 日志查看器\",\"hidePanelTitles\":false},\"title\":\"Mini 日志查看器\",\"panelRefName\":\"panel_8\"}]","timeRestore":false,"title":"Dashboard-CW-INET-MON","version":1},"id":"383c6900-e269-11ed-9e32-9b382625f56b","migrationVersion":{"dashboard":"7.9.3"},"references":[{"id":"623e08f0-f7d9-11ed-969d-8b4100ed7c0d","name":"panel_0","type":"visualization"},{"id":"e0cebcf0-e064-11ed-9e32-9b382625f56b","name":"panel_1","type":"visualization"},{"id":"7c426ee0-e26b-11ed-969d-8b4100ed7c0d","name":"panel_2","type":"visualization"},{"id":"a9465500-e0b3-11ed-9e32-9b382625f56b","name":"panel_3","type":"visualization"},{"id":"a80fdb60-ea78-11ed-9e32-9b382625f56b","name":"panel_4","type":"visualization"},{"id":"d722cf20-f7d9-11ed-9e32-9b382625f56b","name":"panel_5","type":"visualization"},{"id":"5b2a6590-e064-11ed-969d-8b4100ed7c0d","name":"panel_6","type":"visualization"},{"id":"9e042b80-f522-11ed-9e32-9b382625f56b","name":"panel_7","type":"visualization"},{"id":"e062a780-f456-11ed-969d-8b4100ed7c0d","name":"panel_8","type":"search"}],"type":"dashboard","updated_at":"2023-05-21T13:27:19.670Z","version":"WzE1OCwxXQ=="} 15 | {"attributes":{"fields":"[{\"count\":0,\"name\":\"_id\",\"type\":\"string\",\"esTypes\":[\"_id\"],\"scripted\":false,\"searchable\":true,\"aggregatable\":true,\"readFromDocValues\":false},{\"count\":0,\"name\":\"_index\",\"type\":\"string\",\"esTypes\":[\"_index\"],\"scripted\":false,\"searchable\":true,\"aggregatable\":true,\"readFromDocValues\":false},{\"count\":0,\"name\":\"_score\",\"type\":\"number\",\"scripted\":false,\"searchable\":false,\"aggregatable\":false,\"readFromDocValues\":false},{\"count\":0,\"name\":\"_source\",\"type\":\"_source\",\"esTypes\":[\"_source\"],\"scripted\":false,\"searchable\":false,\"aggregatable\":false,\"readFromDocValues\":false},{\"count\":0,\"name\":\"_type\",\"type\":\"string\",\"scripted\":false,\"searchable\":false,\"aggregatable\":false,\"readFromDocValues\":false},{\"count\":0,\"name\":\"bytesIn\",\"type\":\"number\",\"esTypes\":[\"long\"],\"scripted\":false,\"searchable\":true,\"aggregatable\":true,\"readFromDocValues\":true},{\"count\":0,\"name\":\"bytesOut\",\"type\":\"number\",\"esTypes\":[\"long\"],\"scripted\":false,\"searchable\":true,\"aggregatable\":true,\"readFromDocValues\":true},{\"count\":0,\"name\":\"clientConnectionCount\",\"type\":\"number\",\"esTypes\":[\"integer\"],\"scripted\":false,\"searchable\":true,\"aggregatable\":true,\"readFromDocValues\":true},{\"count\":0,\"name\":\"clientLocation.asn\",\"type\":\"number\",\"esTypes\":[\"integer\"],\"scripted\":false,\"searchable\":true,\"aggregatable\":true,\"readFromDocValues\":true},{\"count\":0,\"name\":\"clientLocation.city\",\"type\":\"string\",\"esTypes\":[\"keyword\"],\"scripted\":false,\"searchable\":true,\"aggregatable\":true,\"readFromDocValues\":true},{\"count\":0,\"name\":\"clientLocation.country\",\"type\":\"string\",\"esTypes\":[\"keyword\"],\"scripted\":false,\"searchable\":true,\"aggregatable\":true,\"readFromDocValues\":true},{\"count\":0,\"name\":\"clientLocation.countryCode\",\"type\":\"string\",\"esTypes\":[\"keyword\"],\"scripted\":false,\"searchable\":true,\"aggregatable\":true,\"readFromDocValues\":true},{\"count\":0,\"name\":\"clientLocation.latitude\",\"type\":\"number\",\"esTypes\":[\"float\"],\"scripted\":false,\"searchable\":true,\"aggregatable\":true,\"readFromDocValues\":true},{\"count\":0,\"name\":\"clientLocation.longitude\",\"type\":\"number\",\"esTypes\":[\"float\"],\"scripted\":false,\"searchable\":true,\"aggregatable\":true,\"readFromDocValues\":true},{\"count\":0,\"name\":\"clientLocation.metro\",\"type\":\"string\",\"esTypes\":[\"keyword\"],\"scripted\":false,\"searchable\":true,\"aggregatable\":true,\"readFromDocValues\":true},{\"count\":0,\"name\":\"clientLocation.networkName\",\"type\":\"string\",\"esTypes\":[\"keyword\"],\"scripted\":false,\"searchable\":true,\"aggregatable\":true,\"readFromDocValues\":true},{\"count\":0,\"name\":\"clientLocation.subdivision\",\"type\":\"string\",\"esTypes\":[\"keyword\"],\"scripted\":false,\"searchable\":true,\"aggregatable\":true,\"readFromDocValues\":true},{\"count\":0,\"name\":\"clientLocation.subdivisionCode\",\"type\":\"string\",\"esTypes\":[\"keyword\"],\"scripted\":false,\"searchable\":true,\"aggregatable\":true,\"readFromDocValues\":true},{\"count\":0,\"name\":\"internetHealth.availability.experienceScore\",\"type\":\"number\",\"esTypes\":[\"integer\"],\"scripted\":false,\"searchable\":true,\"aggregatable\":true,\"readFromDocValues\":true},{\"count\":0,\"name\":\"internetHealth.availability.percentageOfClientLocationImpacted\",\"type\":\"number\",\"esTypes\":[\"float\"],\"scripted\":false,\"searchable\":true,\"aggregatable\":true,\"readFromDocValues\":true},{\"count\":0,\"name\":\"internetHealth.availability.percentageOfTotalTrafficImpacted\",\"type\":\"number\",\"esTypes\":[\"float\"],\"scripted\":false,\"searchable\":true,\"aggregatable\":true,\"readFromDocValues\":true},{\"count\":0,\"name\":\"internetHealth.performance.experienceScore\",\"type\":\"number\",\"esTypes\":[\"integer\"],\"scripted\":false,\"searchable\":true,\"aggregatable\":true,\"readFromDocValues\":true},{\"count\":0,\"name\":\"internetHealth.performance.percentageOfClientLocationImpacted\",\"type\":\"number\",\"esTypes\":[\"float\"],\"scripted\":false,\"searchable\":true,\"aggregatable\":true,\"readFromDocValues\":true},{\"count\":0,\"name\":\"internetHealth.performance.percentageOfTotalTrafficImpacted\",\"type\":\"number\",\"esTypes\":[\"float\"],\"scripted\":false,\"searchable\":true,\"aggregatable\":true,\"readFromDocValues\":true},{\"count\":0,\"name\":\"internetHealth.performance.roundTripTime.p50\",\"type\":\"number\",\"esTypes\":[\"float\"],\"scripted\":false,\"searchable\":true,\"aggregatable\":true,\"readFromDocValues\":true},{\"count\":0,\"name\":\"internetHealth.performance.roundTripTime.p90\",\"type\":\"number\",\"esTypes\":[\"float\"],\"scripted\":false,\"searchable\":true,\"aggregatable\":true,\"readFromDocValues\":true},{\"count\":0,\"name\":\"internetHealth.performance.roundTripTime.p95\",\"type\":\"number\",\"esTypes\":[\"float\"],\"scripted\":false,\"searchable\":true,\"aggregatable\":true,\"readFromDocValues\":true},{\"count\":0,\"name\":\"percentageOfTotalTraffic\",\"type\":\"number\",\"esTypes\":[\"float\"],\"scripted\":false,\"searchable\":true,\"aggregatable\":true,\"readFromDocValues\":true},{\"count\":0,\"name\":\"serviceLocation\",\"type\":\"string\",\"esTypes\":[\"keyword\"],\"scripted\":false,\"searchable\":true,\"aggregatable\":true,\"readFromDocValues\":true},{\"count\":0,\"name\":\"timestamp\",\"type\":\"date\",\"esTypes\":[\"date\"],\"scripted\":false,\"searchable\":true,\"aggregatable\":true,\"readFromDocValues\":true},{\"count\":0,\"name\":\"version\",\"type\":\"number\",\"esTypes\":[\"integer\"],\"scripted\":false,\"searchable\":true,\"aggregatable\":true,\"readFromDocValues\":true}]","timeFieldName":"timestamp","title":"logs*"},"id":"b8525d50-e004-11ed-969d-8b4100ed7c0d","migrationVersion":{"index-pattern":"7.6.0"},"references":[],"type":"index-pattern","updated_at":"2023-04-21T05:23:59.525Z","version":"WzEsMV0="} 16 | {"attributes":{"description":"","kibanaSavedObjectMeta":{"searchSourceJSON":"{\"query\":{\"query\":\"\",\"language\":\"kuery\"},\"filter\":[],\"indexRefName\":\"kibanaSavedObjectMeta.searchSourceJSON.index\"}"},"title":"test1-","uiStateJSON":"{}","version":1,"visState":"{\"title\":\"test1-\",\"type\":\"area\",\"aggs\":[{\"id\":\"1\",\"enabled\":true,\"type\":\"count\",\"params\":{},\"schema\":\"metric\"}],\"params\":{\"type\":\"area\",\"grid\":{\"categoryLines\":false},\"categoryAxes\":[{\"id\":\"CategoryAxis-1\",\"type\":\"category\",\"position\":\"bottom\",\"show\":true,\"style\":{},\"scale\":{\"type\":\"linear\"},\"labels\":{\"show\":true,\"filter\":true,\"truncate\":100},\"title\":{}}],\"valueAxes\":[{\"id\":\"ValueAxis-1\",\"name\":\"LeftAxis-1\",\"type\":\"value\",\"position\":\"left\",\"show\":true,\"style\":{},\"scale\":{\"type\":\"linear\",\"mode\":\"normal\"},\"labels\":{\"show\":true,\"rotate\":0,\"filter\":false,\"truncate\":100},\"title\":{\"text\":\"Count\"}}],\"seriesParams\":[{\"show\":true,\"type\":\"area\",\"mode\":\"stacked\",\"data\":{\"label\":\"Count\",\"id\":\"1\"},\"drawLinesBetweenPoints\":true,\"lineWidth\":2,\"showCircles\":true,\"interpolate\":\"linear\",\"valueAxis\":\"ValueAxis-1\"}],\"addTooltip\":true,\"addLegend\":true,\"legendPosition\":\"right\",\"times\":[],\"addTimeMarker\":false,\"thresholdLine\":{\"show\":false,\"value\":10,\"width\":1,\"style\":\"full\",\"color\":\"#E7664C\"},\"labels\":{}}}"},"id":"64536a40-e005-11ed-9e32-9b382625f56b","migrationVersion":{"visualization":"7.10.0"},"references":[{"id":"b8525d50-e004-11ed-969d-8b4100ed7c0d","name":"kibanaSavedObjectMeta.searchSourceJSON.index","type":"index-pattern"}],"type":"visualization","updated_at":"2023-04-21T05:28:48.099Z","version":"WzMsMV0="} 17 | {"attributes":{"description":"","kibanaSavedObjectMeta":{"searchSourceJSON":"{\"query\":{\"query\":\"\",\"language\":\"kuery\"},\"filter\":[],\"indexRefName\":\"kibanaSavedObjectMeta.searchSourceJSON.index\"}"},"title":"test2","uiStateJSON":"{}","version":1,"visState":"{\"title\":\"test2\",\"type\":\"pie\",\"aggs\":[{\"id\":\"1\",\"enabled\":true,\"type\":\"count\",\"params\":{},\"schema\":\"metric\"}],\"params\":{\"type\":\"pie\",\"addTooltip\":true,\"addLegend\":true,\"legendPosition\":\"right\",\"isDonut\":true,\"labels\":{\"show\":false,\"values\":true,\"last_level\":true,\"truncate\":100}}}"},"id":"7d3691e0-e005-11ed-9e32-9b382625f56b","migrationVersion":{"visualization":"7.10.0"},"references":[{"id":"b8525d50-e004-11ed-969d-8b4100ed7c0d","name":"kibanaSavedObjectMeta.searchSourceJSON.index","type":"index-pattern"}],"type":"visualization","updated_at":"2023-04-21T05:29:29.854Z","version":"WzQsMV0="} 18 | {"attributes":{"description":"","kibanaSavedObjectMeta":{"searchSourceJSON":"{\"query\":{\"query\":\"\",\"language\":\"kuery\"},\"filter\":[],\"indexRefName\":\"kibanaSavedObjectMeta.searchSourceJSON.index\"}"},"title":"Test3","uiStateJSON":"{}","version":1,"visState":"{\"title\":\"Test3\",\"type\":\"table\",\"aggs\":[{\"id\":\"1\",\"enabled\":true,\"type\":\"percentile_ranks\",\"params\":{\"field\":\"percentageOfTotalTraffic\",\"values\":[0]},\"schema\":\"metric\"},{\"id\":\"2\",\"enabled\":true,\"type\":\"date_range\",\"params\":{\"field\":\"timestamp\",\"ranges\":[{\"from\":\"now-1w/w\",\"to\":\"now\"}]},\"schema\":\"bucket\"}],\"params\":{\"perPage\":10,\"showPartialRows\":false,\"showMetricsAtAllLevels\":false,\"showTotal\":false,\"totalFunc\":\"sum\",\"percentageCol\":\"\"}}"},"id":"b22f1400-e062-11ed-9e32-9b382625f56b","migrationVersion":{"visualization":"7.10.0"},"references":[{"id":"060b5a20-e031-11ed-969d-8b4100ed7c0d","name":"kibanaSavedObjectMeta.searchSourceJSON.index","type":"index-pattern"}],"type":"visualization","updated_at":"2023-04-21T16:36:41.919Z","version":"WzIwLDFd"} 19 | {"attributes":{"fields":"[{\"count\":0,\"name\":\"_id\",\"type\":\"string\",\"esTypes\":[\"_id\"],\"scripted\":false,\"searchable\":true,\"aggregatable\":true,\"readFromDocValues\":false},{\"count\":0,\"name\":\"_index\",\"type\":\"string\",\"esTypes\":[\"_index\"],\"scripted\":false,\"searchable\":true,\"aggregatable\":true,\"readFromDocValues\":false},{\"count\":0,\"name\":\"_score\",\"type\":\"number\",\"scripted\":false,\"searchable\":false,\"aggregatable\":false,\"readFromDocValues\":false},{\"count\":0,\"name\":\"_source\",\"type\":\"_source\",\"esTypes\":[\"_source\"],\"scripted\":false,\"searchable\":false,\"aggregatable\":false,\"readFromDocValues\":false},{\"count\":0,\"name\":\"_type\",\"type\":\"string\",\"scripted\":false,\"searchable\":false,\"aggregatable\":false,\"readFromDocValues\":false},{\"count\":0,\"name\":\"asn\",\"type\":\"number\",\"esTypes\":[\"long\"],\"scripted\":false,\"searchable\":true,\"aggregatable\":true,\"readFromDocValues\":true},{\"count\":0,\"name\":\"availabilityExperienceScore\",\"type\":\"number\",\"esTypes\":[\"long\"],\"scripted\":false,\"searchable\":true,\"aggregatable\":true,\"readFromDocValues\":true},{\"count\":0,\"name\":\"availabilityPercentageOfClientLocationImpacted\",\"type\":\"number\",\"esTypes\":[\"long\"],\"scripted\":false,\"searchable\":true,\"aggregatable\":true,\"readFromDocValues\":true},{\"count\":0,\"name\":\"availabilityPercentageOfTotalTrafficImpacted\",\"type\":\"number\",\"esTypes\":[\"long\"],\"scripted\":false,\"searchable\":true,\"aggregatable\":true,\"readFromDocValues\":true},{\"count\":0,\"name\":\"bytesIn\",\"type\":\"number\",\"esTypes\":[\"long\"],\"scripted\":false,\"searchable\":true,\"aggregatable\":true,\"readFromDocValues\":true},{\"count\":0,\"name\":\"bytesOut\",\"type\":\"number\",\"esTypes\":[\"long\"],\"scripted\":false,\"searchable\":true,\"aggregatable\":true,\"readFromDocValues\":true},{\"count\":0,\"name\":\"city\",\"type\":\"string\",\"esTypes\":[\"text\"],\"scripted\":false,\"searchable\":true,\"aggregatable\":false,\"readFromDocValues\":false},{\"count\":0,\"name\":\"city.keyword\",\"type\":\"string\",\"esTypes\":[\"keyword\"],\"scripted\":false,\"searchable\":true,\"aggregatable\":true,\"readFromDocValues\":true,\"subType\":{\"multi\":{\"parent\":\"city\"}}},{\"count\":0,\"name\":\"clientConnectionCount\",\"type\":\"number\",\"esTypes\":[\"integer\"],\"scripted\":false,\"searchable\":true,\"aggregatable\":true,\"readFromDocValues\":true},{\"count\":0,\"name\":\"clientLocation.asn\",\"type\":\"number\",\"esTypes\":[\"integer\"],\"scripted\":false,\"searchable\":true,\"aggregatable\":true,\"readFromDocValues\":true},{\"count\":0,\"name\":\"clientLocation.city\",\"type\":\"string\",\"esTypes\":[\"keyword\"],\"scripted\":false,\"searchable\":true,\"aggregatable\":true,\"readFromDocValues\":true},{\"count\":0,\"name\":\"clientLocation.country\",\"type\":\"string\",\"esTypes\":[\"keyword\"],\"scripted\":false,\"searchable\":true,\"aggregatable\":true,\"readFromDocValues\":true},{\"count\":0,\"name\":\"clientLocation.countryCode\",\"type\":\"string\",\"esTypes\":[\"keyword\"],\"scripted\":false,\"searchable\":true,\"aggregatable\":true,\"readFromDocValues\":true},{\"count\":0,\"name\":\"clientLocation.latitude\",\"type\":\"number\",\"esTypes\":[\"float\"],\"scripted\":false,\"searchable\":true,\"aggregatable\":true,\"readFromDocValues\":true},{\"count\":0,\"name\":\"clientLocation.longitude\",\"type\":\"number\",\"esTypes\":[\"float\"],\"scripted\":false,\"searchable\":true,\"aggregatable\":true,\"readFromDocValues\":true},{\"count\":0,\"name\":\"clientLocation.metro\",\"type\":\"string\",\"esTypes\":[\"keyword\"],\"scripted\":false,\"searchable\":true,\"aggregatable\":true,\"readFromDocValues\":true},{\"count\":0,\"name\":\"clientLocation.networkName\",\"type\":\"string\",\"esTypes\":[\"keyword\"],\"scripted\":false,\"searchable\":true,\"aggregatable\":true,\"readFromDocValues\":true},{\"count\":0,\"name\":\"clientLocation.subdivision\",\"type\":\"string\",\"esTypes\":[\"keyword\"],\"scripted\":false,\"searchable\":true,\"aggregatable\":true,\"readFromDocValues\":true},{\"count\":0,\"name\":\"clientLocation.subdivisionCode\",\"type\":\"string\",\"esTypes\":[\"keyword\"],\"scripted\":false,\"searchable\":true,\"aggregatable\":true,\"readFromDocValues\":true},{\"count\":0,\"name\":\"country\",\"type\":\"string\",\"esTypes\":[\"text\"],\"scripted\":false,\"searchable\":true,\"aggregatable\":false,\"readFromDocValues\":false},{\"count\":0,\"name\":\"country.keyword\",\"type\":\"string\",\"esTypes\":[\"keyword\"],\"scripted\":false,\"searchable\":true,\"aggregatable\":true,\"readFromDocValues\":true,\"subType\":{\"multi\":{\"parent\":\"country\"}}},{\"count\":0,\"name\":\"countryCode\",\"type\":\"string\",\"esTypes\":[\"text\"],\"scripted\":false,\"searchable\":true,\"aggregatable\":false,\"readFromDocValues\":false},{\"count\":0,\"name\":\"countryCode.keyword\",\"type\":\"string\",\"esTypes\":[\"keyword\"],\"scripted\":false,\"searchable\":true,\"aggregatable\":true,\"readFromDocValues\":true,\"subType\":{\"multi\":{\"parent\":\"countryCode\"}}},{\"count\":0,\"name\":\"internetHealth.availability.experienceScore\",\"type\":\"number\",\"esTypes\":[\"integer\"],\"scripted\":false,\"searchable\":true,\"aggregatable\":true,\"readFromDocValues\":true},{\"count\":0,\"name\":\"internetHealth.availability.percentageOfClientLocationImpacted\",\"type\":\"number\",\"esTypes\":[\"float\"],\"scripted\":false,\"searchable\":true,\"aggregatable\":true,\"readFromDocValues\":true},{\"count\":0,\"name\":\"internetHealth.availability.percentageOfTotalTrafficImpacted\",\"type\":\"number\",\"esTypes\":[\"float\"],\"scripted\":false,\"searchable\":true,\"aggregatable\":true,\"readFromDocValues\":true},{\"count\":0,\"name\":\"internetHealth.performance.experienceScore\",\"type\":\"number\",\"esTypes\":[\"integer\"],\"scripted\":false,\"searchable\":true,\"aggregatable\":true,\"readFromDocValues\":true},{\"count\":0,\"name\":\"internetHealth.performance.percentageOfClientLocationImpacted\",\"type\":\"number\",\"esTypes\":[\"float\"],\"scripted\":false,\"searchable\":true,\"aggregatable\":true,\"readFromDocValues\":true},{\"count\":0,\"name\":\"internetHealth.performance.percentageOfTotalTrafficImpacted\",\"type\":\"number\",\"esTypes\":[\"float\"],\"scripted\":false,\"searchable\":true,\"aggregatable\":true,\"readFromDocValues\":true},{\"count\":0,\"name\":\"internetHealth.performance.roundTripTime.p50\",\"type\":\"number\",\"esTypes\":[\"float\"],\"scripted\":false,\"searchable\":true,\"aggregatable\":true,\"readFromDocValues\":true},{\"count\":0,\"name\":\"internetHealth.performance.roundTripTime.p90\",\"type\":\"number\",\"esTypes\":[\"float\"],\"scripted\":false,\"searchable\":true,\"aggregatable\":true,\"readFromDocValues\":true},{\"count\":0,\"name\":\"internetHealth.performance.roundTripTime.p95\",\"type\":\"number\",\"esTypes\":[\"float\"],\"scripted\":false,\"searchable\":true,\"aggregatable\":true,\"readFromDocValues\":true},{\"count\":0,\"name\":\"latitude\",\"type\":\"number\",\"esTypes\":[\"float\"],\"scripted\":false,\"searchable\":true,\"aggregatable\":true,\"readFromDocValues\":true},{\"count\":0,\"name\":\"longitude\",\"type\":\"number\",\"esTypes\":[\"float\"],\"scripted\":false,\"searchable\":true,\"aggregatable\":true,\"readFromDocValues\":true},{\"count\":0,\"name\":\"metro\",\"type\":\"string\",\"esTypes\":[\"text\"],\"scripted\":false,\"searchable\":true,\"aggregatable\":false,\"readFromDocValues\":false},{\"count\":0,\"name\":\"metro.keyword\",\"type\":\"string\",\"esTypes\":[\"keyword\"],\"scripted\":false,\"searchable\":true,\"aggregatable\":true,\"readFromDocValues\":true,\"subType\":{\"multi\":{\"parent\":\"metro\"}}},{\"count\":1,\"name\":\"networkName\",\"type\":\"string\",\"esTypes\":[\"text\"],\"scripted\":false,\"searchable\":true,\"aggregatable\":false,\"readFromDocValues\":false},{\"count\":0,\"name\":\"networkName.keyword\",\"type\":\"string\",\"esTypes\":[\"keyword\"],\"scripted\":false,\"searchable\":true,\"aggregatable\":true,\"readFromDocValues\":true,\"subType\":{\"multi\":{\"parent\":\"networkName\"}}},{\"count\":0,\"name\":\"p50RoundTripTime\",\"type\":\"number\",\"esTypes\":[\"long\"],\"scripted\":false,\"searchable\":true,\"aggregatable\":true,\"readFromDocValues\":true},{\"count\":0,\"name\":\"p90RoundTripTime\",\"type\":\"number\",\"esTypes\":[\"long\"],\"scripted\":false,\"searchable\":true,\"aggregatable\":true,\"readFromDocValues\":true},{\"count\":0,\"name\":\"p95RoundTripTime\",\"type\":\"number\",\"esTypes\":[\"long\"],\"scripted\":false,\"searchable\":true,\"aggregatable\":true,\"readFromDocValues\":true},{\"count\":0,\"name\":\"percentageOfTotalTraffic\",\"type\":\"number\",\"esTypes\":[\"float\"],\"scripted\":false,\"searchable\":true,\"aggregatable\":true,\"readFromDocValues\":true},{\"count\":0,\"name\":\"performanceExperienceScore\",\"type\":\"number\",\"esTypes\":[\"long\"],\"scripted\":false,\"searchable\":true,\"aggregatable\":true,\"readFromDocValues\":true},{\"count\":0,\"name\":\"performancePercentageOfClientLocationImpacted\",\"type\":\"number\",\"esTypes\":[\"long\"],\"scripted\":false,\"searchable\":true,\"aggregatable\":true,\"readFromDocValues\":true},{\"count\":0,\"name\":\"performancePercentageOfTotalTrafficImpacted\",\"type\":\"number\",\"esTypes\":[\"long\"],\"scripted\":false,\"searchable\":true,\"aggregatable\":true,\"readFromDocValues\":true},{\"count\":0,\"name\":\"serviceLocation\",\"type\":\"string\",\"esTypes\":[\"keyword\"],\"scripted\":false,\"searchable\":true,\"aggregatable\":true,\"readFromDocValues\":true},{\"count\":0,\"name\":\"subdivision\",\"type\":\"string\",\"esTypes\":[\"text\"],\"scripted\":false,\"searchable\":true,\"aggregatable\":false,\"readFromDocValues\":false},{\"count\":0,\"name\":\"subdivision.keyword\",\"type\":\"string\",\"esTypes\":[\"keyword\"],\"scripted\":false,\"searchable\":true,\"aggregatable\":true,\"readFromDocValues\":true,\"subType\":{\"multi\":{\"parent\":\"subdivision\"}}},{\"count\":0,\"name\":\"subdivisionCode\",\"type\":\"string\",\"esTypes\":[\"text\"],\"scripted\":false,\"searchable\":true,\"aggregatable\":false,\"readFromDocValues\":false},{\"count\":0,\"name\":\"subdivisionCode.keyword\",\"type\":\"string\",\"esTypes\":[\"keyword\"],\"scripted\":false,\"searchable\":true,\"aggregatable\":true,\"readFromDocValues\":true,\"subType\":{\"multi\":{\"parent\":\"subdivisionCode\"}}},{\"count\":0,\"name\":\"timestamp\",\"type\":\"date\",\"esTypes\":[\"date\"],\"scripted\":false,\"searchable\":true,\"aggregatable\":true,\"readFromDocValues\":true},{\"count\":0,\"name\":\"version\",\"type\":\"number\",\"esTypes\":[\"integer\"],\"scripted\":false,\"searchable\":true,\"aggregatable\":true,\"readFromDocValues\":true}]","timeFieldName":"timestamp","title":"lambda*"},"id":"ebc21d00-e4c9-11ed-9e32-9b382625f56b","migrationVersion":{"index-pattern":"7.6.0"},"references":[],"type":"index-pattern","updated_at":"2023-04-28T00:16:37.307Z","version":"WzU1LDFd"} 20 | {"exportedCount":19,"missingRefCount":0,"missingReferences":[]} --------------------------------------------------------------------------------