Webex QoE Dashboard
Webex integrated dashboard that can also detect problem signs from quality visualization.
QoE is an abbreviation for Quality of the Experience. It means the satisfaction level of a meeting.
Overview
Anyone can easily understand the status of Webex and receive signs of problems simply by accessing the dashboard.
Also, if Webex isn't working properly, you can properly isolate whether it's a home problem, an internet problem, or a service problem.
Services of Webex QoE Dashboard
The dashboard was set up in four areas.
- Health Score:The overall score as QoE and the problems of each analysis result are displayed together.
- Internet Path Quality Assesment:Display the quality evaluation result of path between the webex user and the server that processes the Webex meeting.
- Cisco Official Service Availability:Analyze and display Cisco official service operation status and Tweets containing the keyword webex of other users from Twitter.
- User's Webex Auality Information:Analyzing and displaying the user's latest environmental information.
Agenda
- Language and environment
- System Configuration
- Preparation
- Deploy
- How to use
Language and Environment
Public Cloud Provider: AWS
Function Runtime: Python3.9
Preparation
Generate API Token
-
Twitter API
Apply for an API account at Developer Platform.
The account used in this system is a free account. The following information is required when applying.
- Note: It may take some time from application to granting Developer authority.
-
ThousandEyes API
Refer to the ThousandEyes DEVELOPER REFERENCE and issue an API Token.
A service contract is required to use the ThousandEyes API.
To use the API, you need a Token issued with administrator privileges.
-
Webex Meetings Quality API
Create an administrator account at Developer Site.
To use Webex Meetings Quality API, you need a paid service (pro pack) contract.
Reference:To use this endpoint the org needs to be licensed for pro pack.
To use the Webex Meetings Quality API, you need a Token issued with administrator privileges.
Set an OAuth Authentication at https://developer.webex.com/docs/integrations.
ThousandEyes Settings
-
Set the route visualization with ThousandEyes at https://app.thousandeyes.com/login.
- Cloud & Enterprise Agents > Test Settings > Add New Test.
- Webex Collabration Bridge:
- Type: Web-HTTP Server
- URL: Enter Collabration Bridge URL in your environment.
- Webex DNS Test
- Type: DNS Server
- Domain: Enter Webex Domain in your environment.
- Webex Http Server
- Type: Web-HTTP Server
- URL: Enter Webex Site URL in your environment.
- Webex MultiMedia Platform
- Type: Network - Agent to Server
- URL: Enter MultiMedia Platform URL in your environment.
- Reference: https://docs.thousandeyes.com/product-documentation/internet-and-wan-monitoring/tests
-
Set the nortification with ThousandEyes at https://app.thousandeyes.com/login.
-
Check the test ID to be entered in the environment variable of Lambda with a tool such as POSTMAN with API.
Deploy
note: Deploy all resources in the same region except global resources such as IAM.
Create function source code .zip archives
Create function source code archive files for uploading to AWS Lambda functions.
https://docs.aws.amazon.com/lambda/latest/dg/python-package.html
- Install latest Python 3.9.x in your local machine.
- Git clone this repository or download with archived file and extract it.
- Go to the repository root directory with a terminal.
- Download dependency packages with pip.
pip install -r webexdev-status/requirements.txt -t webexdev-status
pip install -r webexdev-te/requirements.txt -t webexdev-te
pip install -r webexdev-twitterapi/requirements.txt -t webexdev-twitterapi
- Create archives for each function directories below.
- webexdev-core
- webexdev-mtgquality
- webexdev-status
- webexdev-te
- webexdev-twitterapi
cd {function directory}
zip -r ../{function directory}.zip .
# Example
cd webexdev-status
zip -r ../webexdev-status.zip .
This is an example for unix os .zip file archive utility. You can use other third party zip utility (such as 7zip).
Create an AWS IAM user with administrator access for deployment
- Create an AWS IAM user with the 'AdministratorAccess' policy referring to the AWS document bellow:
Creating your first IAM admin user and group
- Sign in with the created IAM user for following sections.
Create Secrets in AWS Secret Manager
- Sign in to the AWS Management Console and open the Secret Manager console at
https://console.aws.amazon.com/secretsmanager/home
- Choose Store a new secret, and create new secrets and set the following:
- Secrets for readonly access
- Secret Type: Other secret types
- Secret Key/Value: Set the keys listed below
- hostEmail: Enter webexhost userid
- userEmail: Enter webex userid
- CLIENT_ID: Enter webexadmin clientid
- CLIENT_SECRET: Enter webexadmin clientsecret
- TE_OAUTHBEARER_TOKEN_V7: Enter ThousandEyes admin token
- API_KEY: Enter twitterapi apikey
- API_SECRET: Enter twitterapi apisecret
- TWITTER_TOKEN: Enter twitterapi token
- TWITTER_TOKEN_SECRET: Enter twitterapi tokensecret
- Secret Name:
webexdev/secrets
- Secrets for read/write access
- Secret Type: Other secret types
- Secret Key/Value: Set the keys listed below
- ACCESS_TOKEN: Enter webexadmin accesstoken
- REFRESH_TOKEN: Enter webexadmin refreshtoken
- Secret Name:
webexdev/mtgquality-token
Create a new Amazon S3 bucket
Create a new Amazon S3 bucket to store static files and collected data files.
https://docs.aws.amazon.com/AmazonS3/latest/userguide/create-bucket-overview.html
- Sign in to the AWS Management Console and open the Amazon S3 console at https://console.aws.amazon.com/s3/.
- Choose Create bucket.
- Enter parameters and select options as follows:
Bucket name
: (Enter a name which is globally unique)
AWS Region
: (Select a region which geographically close to the accessing client)
- Other parameters and options can be left at their defaults.
- From the bucket list, choose the bucket you just created.
- Choose Permissions tab, and choose Edit in Bucket policy.
- Copy and paste the following policy and replace the texts enclosed in
{}
depending on your environment:
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Principal": "*",
"Action": "s3:GetObject",
"Resource": "arn:aws:s3:::{Replace this with the bucket name you entered in the previous step}/*",
"Condition": {
"IpAddress": {
"aws:SourceIp": [
"{Replace this with your accessing client IP address}"
]
}
}
}
]
}
- Choose Save changes.
- Go back to the bucket page, and open Objects tab.
- Choose Upload
- Choose Add Files and select all files in
s3-files
directory in this repository from local file system.
- Choose Upload to upload files
- Choose Add Folder and select img directory in
s3-files
directory in this repository from local file system.
- Choose Upload to upload directory
Please upload the files and directories separately. Do not upload the 's3-files' folder itself.
Create Amazon DynamoDB tables
Create Amazon DynamoDB tables for storing data from the cloud service APIs, RSS feeds and Webhooks.
https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/getting-started-step-1.html
- Sign in to the AWS Management Console and open the DynamoDB console at https://console.aws.amazon.com/dynamodb/.
- In the navigation pane on the left side of the console, choose Dashboard.
- On the right side of the console, choose Create Table.
- Enter the table details as follows:
- Enter Table name specified in the table below.
- Enter Partition key specified in the table below.
- Enter Sort key - optional specified in the table below.
- Leave Default settings selected.
- Choose Create to create the table.
- Repeat step 2-4 for the following tables
Table name |
Description |
Partition key |
Sort key |
webexdev-status |
Stores data obtained from the Cisco services status RSS feed |
title (String) |
- |
webexdev-te |
Stores data obtained from the Thousand Eyes API and webhook notifications |
datetime (String) |
- |
webexdev-te-polling |
Stores data obtained from the Thousand Eyes API by polling regularly |
datetime (String) |
- |
webexdev-twitter |
Stores Tweet data obtained from Twitter APIs |
datetime (Number) |
- |
webexdev-mtgquality |
Stores data obtained from the Webex Quality API with administrator privileges |
meetingid (String) |
useremail (String) |
Create Access Policy
- Sign in to the AWS Management Console and open the IAM console at
https://console.aws.amazon.com/iamv2/home#/policies
- Choose IAM Service > Manage Access > Policy and select Create Policy.
- Apply the following JSON data and create policies.
- Allow Dynamo DB access
- Name:
WebexdevTableAccess
note: Change the {AWS Region where you created dynamodb table}
and {AWS Account ID}
parameters according to your environment.
- Policy document:
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": "dynamodb:*",
"Resource": [
"arn:aws:dynamodb:{AWS Region where you created dynamodb table}:{AWS Accound ID}:table/webexdev-te",
"arn:aws:dynamodb:{AWS Region where you created dynamodb table}:{AWS Accound ID}:table/webexdev-te-polling",
"arn:aws:dynamodb:{AWS Region where you created dynamodb table}:{AWS Accound ID}:table/webexdev-mtgquality",
"arn:aws:dynamodb:{AWS Region where you created dynamodb table}:{AWS Accound ID}:table/webexdev-status",
"arn:aws:dynamodb:{AWS Region where you created dynamodb table}:{AWS Accound ID}:table/webexdev-twitter"
]
}
]
}
- Allow Secret Manager get only access
- Name:
SecretsManagerGetSecretValueONLY
- Policy document:
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": "secretsmanager:GetSecretValue",
"Resource": "*"
}
]
}
Create AWS Lambda functions
Create AWS Lambda Functions and upload scripts to collect data from the cloud service APIs, RSS feeds and Webhooks.
https://docs.aws.amazon.com/lambda/latest/dg/getting-started-create-function.html
- Sign in to the AWS Management Console and open the AWS Lambda console at https://console.aws.amazon.com/lambda/home#/functions
- Choose Create function
- Under Basic information, do the following:
- Enter
Function name
specified in the table below.
- Select Python 3.9 in
Runtime
:
- Other parameters and options can be left at their defaults.
- Repeat step 2-3 for all functions in the table below, using the same options.
- From the function list, select the function you just created.
- Choose Upload from right top of the source Code area.
- Choose .zip file and select archived file you have created previous section from your local file system.
- Choose Save
- Repeat step 5-8 for all functions you have created.
- From the function list, select the function you just created.
- Choose General configuration in the Configuration tab, and choose Edit.
- Set Timeout and Memory as the value specified in the table below.
- Choose Save.
- Choose Triggers in the Configuration tab, and choose Add trigger.(Note that some functions don't need triggers)
- Choose Select a trigger, and select 'EventBridge (CloudWatch Events)'.
- Select Create a new rule.
- Enter any unique Rule name.
- Select Schedule expression.
- Enter Schedule expression specified in the table below.
- Choose Add.
- Choose Permissions in the Configuration tab, and open link with the created role name.
- Choose Add permissions in the Permissions policies pane, then choose Attach policies.
- Search policies in the Other permissions policies, and check all policies specified in the table below.
- Choose Attach policies, and go back to the Lambda console.
- Choose Environment valiables in the Configuration tab, and choose Edit.
- Add environment valiables specified in the table below.
- Choose Save.
- Repeat step 10-28 for all functions you have created.
Function name |
Description |
Permissions policies |
Timeout |
Memory |
Schedule expression |
Environment variables |
webexdev-status |
Periodically triggered and retrieves Cisco service status RSS feeds and stores the data in the DynamodDB table |
|
15 sec |
Default(128MB) |
rate(5 minutes) |
- TZ: (Time zone for your location. e.g. Asia/Tokyo)
- DYNAMODB_TABLENAME: webexdev-status
|
webexdev-te |
Periodically trrigered, or triggered by Thousand Eyes webhook notifications and stores the data in the DynamodDB table. |
- WebexdevTableAccess
- AmazonS3FullAccess
- SecretsManagerGetSecretValueONLY
|
15 sec |
Default(128MB) |
rate(15 minutes) (This function is also triggered via API Gateway configured in the following sections) |
|
webexdev-twitterapi |
Periodically triggered and retrieves data by Twitter APIs and stores the data in the DynamodDB table |
- WebexdevTableAccess
- SecretsManagerGetSecretValueONLY
- ComprehendFullAccess
|
15 sec |
Default(128MB) |
rate(15 minutes) |
- TZ: (Time zone for your location. e.g. Asia/Tokyo)
- DYNAMODB_TABLENAME: webexdev-twitter
- SECRETMANAGER_NAME: webexdev/secrets
|
webexdev-mtgquality |
Periodically retrieves data by Webex Quality API with administrator privileges, acquires the environment information of participants connected to Webex, and stores data in the DynamodDB table. |
- WebexdevTableAccess
- SecretsManagerReadWrite
|
15 sec |
Default(128MB) |
- (This function is designed to be manually triggered when needed) |
- TZ: (Time zone for your location. e.g. Asia/Tokyo)
- DYNAMODB_TABLENAME: webexdev-mtgquality
- SECRETMANAGER_TOKEN_NAME: webexdev/mtgquality-token
- SECRETMANAGER_NAME: webexdev/secrets
|
webexdev-core |
Periodically triggered and generate static HTML files and store them in the S3 bucket |
- WebexdevTableAccess
- AmazonS3FullAccess
|
20 sec |
1024MB |
rate(1 minute) |
- TZ: (Time zone for your location. e.g. Asia/Tokyo)
- CLOUDWATCH_URL: (Shared URL for the CloudWatch Logs Insight dashboard you created in the next section)
- S3_BUCKET_NAME: (S3 bucket name you created in the previous section)
- SECRETMANAGER_NAME: webexdev/secrets
- DYNAMODB_TABLENAME_STATUS: webexdev-status
- DYNAMODB_TABLENAME_TEPOLLING: webexdev-te-polling
- DYNAMODB_TABLENAME_TWITTER: webexdev-twitter
- DYNAMODB_TABLENAME_MTGQA: webexdev-mtgquality
|
Create Logs Insight
- Sign in to the AWS Management Console and open the AWS Lambda console at
https://console.aws.amazon.com/cloudwatch/home
- Choose CloudWatch Service > Logs > Logs Insights.
- Choose Query Tab and Create Query.
- Create following querys:
- Query Name:
webexdev-te-query alert
Loggroup:/aws/lambda/webexdev-te
Query Text:
fields @timestamp, @message
| limit 200
| filter @message like /alert/
| fields alert
| display alert.agents.0.dateStart, alert.active ,alert.agents.0.metricsAtStart, alert.testName,alert.agents.0.dateEnd, alert.agents.0.metricsAtEnd
- Query Name:
webexdev-te-query metrics
Loggroup:/aws/lambda/webexdev-te
Query Text:
fields @timestamp, @message
| limit 200
| filter @message like /metrics/
| fields metrics
| display date, jitter, loss, avgLatency, agentName
| stats avg(jitter),avg(loss),avg(avgLatency) by bin(60s)
- Query Name:
webexdev-te-query response
Loggroup:/aws/lambda/webexdev-te
Query Text:
fields @timestamp, @message
| limit 200
| filter @message like /response/
| fields responseTime
| display date, responseTime, agentName
| stats avg(responseTime) by bin(60s)
- Choose Add to dashboard and create new dashboard, then plot 3 queries with graph or table.
note: If you don't see the Lambda log group you created, clear your browser's cache.
- Choose Save Dashboard.
- Choose Action > Share Dashboard and select the share button in the item to share the dashboard to the public.
- Copy the shared link on the dashboard. Make sure you can browse the Dashboard without logging in to the AWS Management Console.
- Make a note of the shared link and set it in an environment variable at the
webex-core
Lambda function.
- If you want to change the settings later, you can check it from Settings> Share Dashboard.
Create AWS API Gateway
- Sign in to the AWS Management Console and open the API Gateway console at
https://console.aws.amazon.com/apigateway/
- Choose API GAteway Service > Create API.
Select Build from REST API, enter webexdev
as the API name, and select Create API.
- Choose Actions> Create Resource and enter
tecloudagent
as the resource name and select Create Resource.
- Specify the method POST for the resource name created above. Set
webexdev-te
to the item of the Lambda function.
- Confirm that the Lambda function called from API Gateway has been set.
- Choose Action > Deploy API.
- Deploy Stage: Choose New Stage.
- Enter "release" as stagename.
- Click Deploy button.
- Choose Stage > release > / > /tecloudagent > POST, then you can get API Gateway Endpoint URL.
- Specify this URL if you want to specify the ThousandEyes alert destination.
How to use
Access to the Dashboard
- Sign in to the AWS Management Console and open the Amazon S3 console at https://console.aws.amazon.com/s3/.
- Choose your created bucket in the deploy section.
- Choose
index.html
in the listed objects.
- Copy Object URL at the bottom right of the Object overview.
- Access the copied Object URL from your browser.