├── 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 | 
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 | 
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 | 
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 | 
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":[]}
--------------------------------------------------------------------------------