wso2 / kubernetes-apim

Kubernetes and Helm resources for WSO2 API Manager
Apache License 2.0
114 stars 216 forks source link

Analytics-Dashboard failing to connect to APIM in semi distributed setup #313

Open invent360 opened 4 years ago

invent360 commented 4 years ago

Description: Setting up a cluster of APIM components such that APIM Gateway, Publisher, DevPortal and Key Manager are in one node and Analytics in another node. Analytics Dashboard comes up but fails to load Analytics data from APIM with the following errors Screenshot 2020-01-05 at 00 44 30

APIM deployment.toml [server] hostname = "$env{HOST_NAME}" node_ip = "$env{NODE_IP}"

offset=0

mode = "single" #single or ha
base_path = "${carbon.protocol}://${carbon.host}:${carbon.management.port}"
#discard_empty_caches = false
server_role = "default"

[super_admin]
username = "admin"
password = "admin"
create_admin_account = true

[user_store]
type = "database"

[database.apim_db]
type = "mysql"
url = "jdbc:mysql://apim-db:3306/WSO2AM_DB?autoReconnect=true&useSSL=false"
username = "wso2carbon"
password = "wso2carbon"
driver = "com.mysql.cj.jdbc.Driver"

[database.shared_db]
type = "mysql"
url = "jdbc:mysql://apim-db:3306/WSO2AM_SHARED_DB?autoReconnect=true&useSSL=false"
username = "wso2carbon"
password = "wso2carbon"
driver = "com.mysql.cj.jdbc.Driver"

[keystore.tls]
file_name =  "wso2carbon.jks"
type =  "JKS"
password =  "wso2carbon"
alias =  "wso2carbon"
key_password =  "wso2carbon"

[[apim.gateway.environment]]
name = "Production and Sandbox"
type = "hybrid"
display_in_api_console = true
description = "This is a hybrid gateway that handles both production and sandbox token traffic."
show_as_token_endpoint_url = true
service_url = "https://localhost:${mgt.transport.https.port}/services/"
username= "${admin.username}"
password= "${admin.password}"
ws_endpoint = "ws://localhost:9099"
wss_endpoint = "wss://localhost:8099"
http_endpoint = "http://localhost:${http.nio.port}"
https_endpoint = "https://localhost:${https.nio.port}"

#[apim.cache.gateway_token]
#enable = true
#expiry_time = "900s"

#[apim.cache.resource]
#enable = true
#expiry_time = "900s"

#[apim.cache.km_token]
#enable = false
#expiry_time = "15m"

#[apim.cache.recent_apis]
#enable = false

#[apim.cache.scopes]
#enable = true

#[apim.cache.publisher_roles]
#enable = true

#[apim.cache.jwt_claim]
#enable = true
#expiry_time = "15m"

#[apim.cache.tags]
#expiry_time = "2m"

[apim.analytics]
enable = true
store_api_url = "https://apim-analytics-worker:7444"
#username = "$ref{super_admin.username}"
#password = "$ref{super_admin.password}"
#event_publisher_type = "default"
#event_publisher_impl = "org.wso2.carbon.apimgt.usage.publisher.APIMgtUsageDataBridgeDataPublisher"
#publish_response_size = true

[[apim.analytics.url_group]]
analytics_url =["tcp://apim-analytics-worker:7612"]
analytics_auth_url =["ssl://apim-analytics-worker:7712"]
#type = "loadbalance"

#[[apim.analytics.url_group]]
#analytics_url =["tcp://analytics1:7612","tcp://analytics2:7612"]
#analytics_auth_url =["ssl://analytics1:7712","ssl://analytics2:7712"]
#type = "failover"

[apim.key_manager]
service_url = "https://localhost:${mgt.transport.https.port}/services/"
#username = "$ref{super_admin.username}"
#password = "$ref{super_admin.password}"
#pool.init_idle_capacity = 50
#pool.max_idle = 100
#key_validation_handler_type = "default"
#key_validation_handler_type = "custom"
#key_validation_handler_impl = "org.wso2.carbon.apimgt.keymgt.handlers.DefaultKeyValidationHandler"

#[apim.jwt]
#enable = true
#encoding = "base64" # base64,base64url
#generator_impl = "org.wso2.carbon.apimgt.keymgt.token.JWTGenerator"
#claim_dialect = "http://wso2.org/claims"
#header = "X-JWT-Assertion"
#signing_algorithm = "SHA256withRSA"
#enable_user_claims = true
#claims_extractor_impl = "org.wso2.carbon.apimgt.impl.token.DefaultClaimsRetriever"

#[apim.oauth_config]
#enable_outbound_auth_header = false
#auth_header = "Authorization"
#revoke_endpoint = "https://localhost:${https.nio.port}/revoke"
#enable_token_encryption = false
#enable_token_hashing = false

[apim.devportal]
url = "https://localhost:${mgt.transport.https.port}/devportal"
#enable_application_sharing = false
#if application_sharing_type, application_sharing_impl both defined priority goes to application_sharing_impl
#application_sharing_type = "default" #changed type, saml, default #todo: check the new config for rest api
#application_sharing_impl = "org.wso2.carbon.apimgt.impl.SAMLGroupIDExtractorImpl"
#display_multiple_versions = false
#display_deprecated_apis = false
#enable_comments = true
#enable_ratings = true
#enable_forum = true

[transport.https.properties]
proxyPort = 443

[apim.cors]
allow_origins = "*"
allow_methods = ["GET","PUT","POST","DELETE","PATCH","OPTIONS"]
allow_headers = ["authorization","Access-Control-Allow-Origin","Content-Type","SOAPAction"]
allow_credentials = false

[apim.throttling]
enable_data_publishing = false
#enable_policy_deploy = true
enable_blacklist_condition = false
enable_persistence = false
#throttle_decision_endpoints = ["tcp://localhost:5672","tcp://localhost:5672"]

#[apim.throttling.blacklist_condition]
#start_delay = "5m"
#period = "1h"

#[apim.throttling.jms]
#start_delay = "5m"

#[apim.throttling.event_sync]
#hostName = "0.0.0.0"
#port = 11224

#[apim.throttling.event_management]
#hostName = "0.0.0.0"
#port = 10005

[[apim.throttling.url_group]]
traffic_manager_urls = ["tcp://localhost:9611","tcp://api-manager:9611"]
traffic_manager_auth_urls = ["ssl://localhost:9711","ssl://api-manager:9711"]
type = "loadbalance"

#[[apim.throttling.url_group]]
#traffic_manager_urls = ["tcp://localhost:9611","tcp://localhost:9611"]
#traffic_manager_auth_urls = ["ssl://localhost:9711","ssl://localhost:9711"]
#type = "failover"

#[apim.workflow]
#enable = false
#service_url = "https://localhost:9445/bpmn"
#username = "$ref{super_admin.username}"
#password = "$ref{super_admin.password}"
#callback_endpoint = "https://localhost:${mgt.transport.https.port}/api/am/admin/v0.15/workflows/update-workflow-status"
#token_endpoint = "https://localhost:${https.nio.port}/token"
#client_registration_endpoint = "https://localhost:${mgt.transport.https.port}/client-registration/v0.15/register"
#client_registration_username = "$ref{super_admin.username}"
#client_registration_password = "$ref{super_admin.password}"

#data bridge config
#[transport.receiver]
#type = "binary"
#worker_threads = 10
#session_timeout = "30m"
#keystore.file_name = "$ref{keystore.tls.file_name}"
#keystore.password = "$ref{keystore.tls.password}"
#tcp_port = 9611
#ssl_port = 9711
#ssl_receiver_thread_pool_size = 100
#tcp_receiver_thread_pool_size = 100
#ssl_enabled_protocols = ["TLSv1","TLSv1.1","TLSv1.2"]
#ciphers = ["SSL_RSA_WITH_RC4_128_MD5","SSL_RSA_WITH_RC4_128_SHA"]

#[apim.notification]
#from_address = "APIM.com"
#username = "APIM"
#password = "APIM+123"
#hostname = "localhost"
#port = 3025
#enable_start_tls = false
#enable_authentication = true

#[apim.token.revocation]
#notifier_impl = "org.wso2.carbon.apimgt.keymgt.events.TokenRevocationNotifierImpl"
#enable_realtime_notifier = true
#realtime_notifier.ttl = 5000
#enable_persistent_notifier = true
#persistent_notifier.hostname = "https://localhost:2379/v2/keys/jti/"
#persistent_notifier.ttl = 5000
#persistent_notifier.username = "root"
#persistent_notifier.password = "root"

[[event_handler]]
name="userPostSelfRegistration"
subscriptions=["POST_ADD_USER"]

[service_provider]
sp_name_regex = "^[\\sa-zA-Z0-9._-]*$"

Analytics Dashboard deployment.toml

  ## Authentication configuration
  auth.configs:
    type: apim
    ssoEnabled: true
    properties:
      adminScope: apim_analytics:admin_carbon.super
      allScopes: apim_analytics:admin apim_analytics:product_manager apim_analytics:api_developer apim_analytics:app_developer apim_analytics:devops_engineer apim_analytics:analytics_viewer apim_analytics:everyone openid apim:api_view apim:subscribe
      adminServiceBaseUrl: https://api-manager:9443
      adminUsername: admin
      adminPassword: admin
      kmDcrUrl: https://api-manager:9443/client-registration/v0.15/register
      kmTokenUrlForRedirection: https://api-manager:9443/oauth2
      kmTokenUrl: https://api-manager:9443/oauth2
      kmUsername: admin
      kmPassword: admin
      portalAppContext: analytics-dashboard
      businessRulesAppContext : business-rules
      cacheTimeout: 900
      baseUrl: https://apim-analytics-dashboard:9643
      grantType: authorization_code
      publisherUrl: https://api-manager:9443
      externalLogoutUrl: https://api-manager:9443/oidc/logout
      #storeUrl: https://localhost:9443
  wso2.dashboard:
    roles:
      creators:
        - apim_analytics:admin_carbon.super

wso2 apim 3.0.0

Kubernetes (Docker Desktop)

abhi1git commented 4 years ago

I have deployed pattern-1 wso2 helm chart on my kubernetes cluster running on AWS. Added ingress with our public domain so as to access dashboard and api manager over the internet. Getting error in dashboard portal in APIM Developer Portal. I have attached all the required screenshots and logs here. Can you please let me know what configuration change is required to overcome the error Access Denied to data provider.

Current Configuration- 1 instance 1 worker

NAME                                                              READY   STATUS    RESTARTS   AGE
wso2-nfs-server-provisioner-0                                     1/1     Running   0          105m
wso2am-mysql-db-service-c8b47bb5b-697lx                           1/1     Running   0          105m
wso2am-pattern-1-am-1-deployment-0                                1/1     Running   0          105m
wso2am-pattern-1-am-analytics-dashboard-deployment-7cf7646ps2zh   1/1     Running   0          105m
wso2am-pattern-1-am-analytics-worker-deployment-6988f7456dw749r   1/1     Running   0          105m

Error logs-

> ubuntu@ubuntu:~/CI-CD/charts/stable$ kubectl logs pod/wso2am-pattern-1-am-analytics-dashboard-deployment-7cf7646ps2zh -n wso2
> Copying critical patch fixes to GA pack
> JAVA_HOME environment variable is set to /opt/java/openjdk
> CARBON_HOME environment variable is set to /home/wso2carbon/wso2am-analytics-3.1.0
> RUNTIME_HOME environment variable is set to /home/wso2carbon/wso2am-analytics-3.1.0/wso2/dashboard
> [2020-05-14 13:52:12,437]  INFO {org.wso2.carbon.launcher.extensions.OSGiLibBundleDeployerUtils updateOSGiLib} - Successfully updated the OSGi bundle information of Carbon Runtime: dashboard  
> osgi> [2020-05-14 13:52:14,746]  INFO {org.wso2.msf4j.internal.websocket.EndpointsRegistryImpl} - Endpoint Registered : /websocket-provider/{topic}
> [2020-05-14 13:52:15,540]  INFO {org.wso2.msf4j.internal.websocket.WebSocketServerSC} - All required capabilities are available of WebSocket service component is available.
> [2020-05-14 13:52:15,565]  INFO {org.wso2.carbon.metrics.core.config.model.JmxReporterConfig} - Creating JMX reporter for Metrics with domain 'org.wso2.carbon.metrics'
> [2020-05-14 13:52:15,595]  INFO {org.wso2.msf4j.analytics.metrics.MetricsComponent} - Metrics Component is activated
> [2020-05-14 13:52:15,639]  INFO {org.wso2.carbon.databridge.agent.internal.DataAgentDS} - Successfully deployed Agent Server 
> [2020-05-14 13:52:15,694]  INFO {org.wso2.msf4j.internal.MicroservicesServerSC} - All microservices are available
> [2020-05-14 13:52:15,773]  INFO {org.wso2.transport.http.netty.contractimpl.listener.ServerConnectorBootstrap$HttpServerConnector} - HTTP(S) Interface starting on host 0.0.0.0 and port 9092
> [2020-05-14 13:52:15,774]  INFO {org.wso2.transport.http.netty.contractimpl.listener.ServerConnectorBootstrap$HttpServerConnector} - HTTP(S) Interface starting on host 0.0.0.0 and port 9643
> [2020-05-14 13:52:16,294]  INFO {org.wso2.msf4j.internal.websocket.EndpointsRegistryImpl} - Endpoint Registered : /data-provider
> [2020-05-14 13:52:16,393]  INFO {org.wso2.carbon.analytics.idp.client.core.utils.IdPServiceUtils} - IdP client of type 'apim' is started.
> [2020-05-14 13:52:16,706]  INFO {org.wso2.carbon.databridge.receiver.binary.internal.BinaryDataReceiverServiceComponent} - org.wso2.carbon.databridge.receiver.binary.internal.Service Component is activated
> [2020-05-14 13:52:16,727]  INFO {org.wso2.carbon.databridge.receiver.thrift.internal.ThriftDataReceiverDS} - Service Component is activated
> WARNING: An illegal reflective access operation has occurred
> WARNING: Illegal reflective access by org.wso2.msf4j.util.RuntimeAnnotations (file:/home/wso2carbon/wso2am-analytics-3.1.0/wso2/lib/plugins/msf4j-core_2.7.7.jar) to constructor sun.reflect.annotation.AnnotationInvocationHandler(java.lang.Class,java.util.Map)
> WARNING: Please consider reporting this to the maintainers of org.wso2.msf4j.util.RuntimeAnnotations
> WARNING: Use --illegal-access=warn to enable warnings of further illegal reflective access operations
> WARNING: All illegal access operations will be denied in a future release
> [2020-05-14 13:52:16,890]  INFO {org.wso2.carbon.uiserver.internal.deployment.listener.AppTransportBinder} - Web app 'business-rules' is available at 'https://100.105.246.148:9643/business-rules'.
> [2020-05-14 13:52:16,926]  INFO {org.wso2.carbon.uiserver.internal.deployment.listener.AppTransportBinder} - Web app 'analytics-dashboard' is available at 'https://100.105.246.148:9643/analytics-dashboard'.
> [2020-05-14 13:52:17,012]  INFO {org.wso2.carbon.dashboards.core.internal.DashboardImporter} - Successfully imported dashboard 'apimadmin' from '/home/wso2carbon/wso2am-analytics-3.1.0/wso2/dashboard/resources/dashboards/apimadmin.json'.
> [2020-05-14 13:52:17,080]  INFO {org.wso2.carbon.dashboards.core.internal.DashboardImporter} - Successfully imported dashboard 'apimpublisher' from '/home/wso2carbon/wso2am-analytics-3.1.0/wso2/dashboard/resources/dashboards/apimpublisher.json'.
> [2020-05-14 13:52:17,115]  INFO {org.wso2.carbon.dashboards.core.internal.DashboardImporter} - Successfully imported dashboard 'apimdevportal' from '/home/wso2carbon/wso2am-analytics-3.1.0/wso2/dashboard/resources/dashboards/apimdevportal.json'.
> [2020-05-14 13:52:17,488]  INFO {org.wso2.carbon.uiserver.internal.deployment.listener.AppTransportBinder} - Web app 'policies' is available at 'https://100.105.246.148:9643/policies'.
> [2020-05-14 13:52:17,491]  INFO {org.wso2.carbon.kernel.internal.CarbonStartupHandler} - WSO2 API Manager Analytics Server started in 5.684 sec
> [2020-05-14 13:52:18,077]  INFO {org.wso2.callhome.internal.CallHome} - 
> .......................................................................
> There are 3 updates available for the product 'wso2am-analytics-3.1.0'.
> .......................................................................
> [2020-05-14 13:52:50,370] ERROR {org.wso2.carbon.data.provider.endpoint.DataProviderEndPoint} - Error occurred while authorizing the access to data provider. SiddhiStoreDataProvider. Access denied to data provider. java.lang.Exception: Access denied to data provider.
>   at org.wso2.carbon.data.provider.endpoint.DataProviderEndPoint.onMessage(DataProviderEndPoint.java:154)
>   at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
>   at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
>   at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
>   at java.base/java.lang.reflect.Method.invoke(Method.java:566)
>   at org.wso2.msf4j.internal.MSF4JWSConnectorListener.executeMethod(MSF4JWSConnectorListener.java:360)
>   at org.wso2.msf4j.internal.MSF4JWSConnectorListener.lambda$handleTextWebSocketMessage$18(MSF4JWSConnectorListener.java:196)
>   at java.base/java.util.Optional.ifPresent(Optional.java:183)
>   at org.wso2.msf4j.internal.MSF4JWSConnectorListener.handleTextWebSocketMessage(MSF4JWSConnectorListener.java:177)
>   at org.wso2.msf4j.internal.MSF4JWSConnectorListener.onMessage(MSF4JWSConnectorListener.java:85)
>   at org.wso2.transport.http.netty.contractimpl.websocket.DefaultWebSocketConnectorFuture.notifyWebSocketListener(DefaultWebSocketConnectorFuture.java:52)
>   at org.wso2.transport.http.netty.contractimpl.websocket.WebSocketInboundFrameHandler.notifyTextMessage(WebSocketInboundFrameHandler.java:203)
>   at org.wso2.transport.http.netty.contractimpl.websocket.WebSocketInboundFrameHandler.channelRead(WebSocketInboundFrameHandler.java:158)
>   at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:359)
>   at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:345)
>   at io.netty.channel.AbstractChannelHandlerContext.fireChannelRead(AbstractChannelHandlerContext.java:337)
>   at io.netty.channel.ChannelInboundHandlerAdapter.channelRead(ChannelInboundHandlerAdapter.java:86)
>   at io.netty.handler.codec.http.websocketx.Utf8FrameValidator.channelRead(Utf8FrameValidator.java:77)
>   at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:359)
>   at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:345)
>   at io.netty.channel.AbstractChannelHandlerContext.fireChannelRead(AbstractChannelHandlerContext.java:337)
>   at io.netty.handler.codec.ByteToMessageDecoder.fireChannelRead(ByteToMessageDecoder.java:323)
>   at io.netty.handler.codec.ByteToMessageDecoder.channelRead(ByteToMessageDecoder.java:297)
>   at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:359)
>   at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:345)
>   at io.netty.channel.AbstractChannelHandlerContext.fireChannelRead(AbstractChannelHandlerContext.java:337)
>   at io.netty.handler.ssl.SslHandler.unwrap(SslHandler.java:1476)
>   at io.netty.handler.ssl.SslHandler.decodeJdkCompatible(SslHandler.java:1225)
>   at io.netty.handler.ssl.SslHandler.decode(SslHandler.java:1272)
>   at io.netty.handler.codec.ByteToMessageDecoder.decodeRemovalReentryProtection(ByteToMessageDecoder.java:502)
>   at io.netty.handler.codec.ByteToMessageDecoder.callDecode(ByteToMessageDecoder.java:441)
>   at io.netty.handler.codec.ByteToMessageDecoder.channelRead(ByteToMessageDecoder.java:278)
>   at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:359)
>   at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:345)
>   at io.netty.channel.AbstractChannelHandlerContext.fireChannelRead(AbstractChannelHandlerContext.java:337)
>   at io.netty.channel.DefaultChannelPipeline$HeadContext.channelRead(DefaultChannelPipeline.java:1408)
>   at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:359)
>   at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:345)
>   at io.netty.channel.DefaultChannelPipeline.fireChannelRead(DefaultChannelPipeline.java:930)
>   at io.netty.channel.nio.AbstractNioByteChannel$NioByteUnsafe.read(AbstractNioByteChannel.java:163)
>   at io.netty.channel.nio.NioEventLoop.processSelectedKey(NioEventLoop.java:677)
>   at io.netty.channel.nio.NioEventLoop.processSelectedKeysOptimized(NioEventLoop.java:612)
>   at io.netty.channel.nio.NioEventLoop.processSelectedKeys(NioEventLoop.java:529)
>   at io.netty.channel.nio.NioEventLoop.run(NioEventLoop.java:491)
>   at io.netty.util.concurrent.SingleThreadEventExecutor$5.run(SingleThreadEventExecutor.java:905)
>   at io.netty.util.concurrent.FastThreadLocalRunnable.run(FastThreadLocalRunnable.java:30)
>   at java.base/java.lang.Thread.run(Thread.java:834)
> 
> [2020-05-14 13:52:50,373] ERROR {org.wso2.carbon.data.provider.endpoint.DataProviderEndPoint} - Error found in method : java.lang.Exception: Access denied to data provider.
> [2020-05-14 13:53:50,364] ERROR {org.wso2.carbon.data.provider.endpoint.DataProviderEndPoint} - Error occurred while authorizing the access to data provider. SiddhiStoreDataProvider. Access denied to data provider. java.lang.Exception: Access denied to data provider.
>   at org.wso2.carbon.data.provider.endpoint.DataProviderEndPoint.onMessage(DataProviderEndPoint.java:154)
>   at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
>   at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
>   at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
>   at java.base/java.lang.reflect.Method.invoke(Method.java:566)
>   at org.wso2.msf4j.internal.MSF4JWSConnectorListener.executeMethod(MSF4JWSConnectorListener.java:360)
>   at org.wso2.msf4j.internal.MSF4JWSConnectorListener.lambda$handleTextWebSocketMessage$18(MSF4JWSConnectorListener.java:196)
>   at java.base/java.util.Optional.ifPresent(Optional.java:183)
>   at org.wso2.msf4j.internal.MSF4JWSConnectorListener.handleTextWebSocketMessage(MSF4JWSConnectorListener.java:177)
>   at org.wso2.msf4j.internal.MSF4JWSConnectorListener.onMessage(MSF4JWSConnectorListener.java:85)
>   at org.wso2.transport.http.netty.contractimpl.websocket.DefaultWebSocketConnectorFuture.notifyWebSocketListener(DefaultWebSocketConnectorFuture.java:52)
>   at org.wso2.transport.http.netty.contractimpl.websocket.WebSocketInboundFrameHandler.notifyTextMessage(WebSocketInboundFrameHandler.java:203)
>   at org.wso2.transport.http.netty.contractimpl.websocket.WebSocketInboundFrameHandler.channelRead(WebSocketInboundFrameHandler.java:158)
>   at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:359)
>   at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:345)
>   at io.netty.channel.AbstractChannelHandlerContext.fireChannelRead(AbstractChannelHandlerContext.java:337)
>   at io.netty.channel.ChannelInboundHandlerAdapter.channelRead(ChannelInboundHandlerAdapter.java:86)
>   at io.netty.handler.codec.http.websocketx.Utf8FrameValidator.channelRead(Utf8FrameValidator.java:77)
>   at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:359)
>   at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:345)
>   at io.netty.channel.AbstractChannelHandlerContext.fireChannelRead(AbstractChannelHandlerContext.java:337)
>   at io.netty.handler.codec.ByteToMessageDecoder.fireChannelRead(ByteToMessageDecoder.java:323)
>   at io.netty.handler.codec.ByteToMessageDecoder.channelRead(ByteToMessageDecoder.java:297)
>   at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:359)
>   at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:345)
>   at io.netty.channel.AbstractChannelHandlerContext.fireChannelRead(AbstractChannelHandlerContext.java:337)
>   at io.netty.handler.ssl.SslHandler.unwrap(SslHandler.java:1476)
>   at io.netty.handler.ssl.SslHandler.decodeJdkCompatible(SslHandler.java:1225)
>   at io.netty.handler.ssl.SslHandler.decode(SslHandler.java:1272)
>   at io.netty.handler.codec.ByteToMessageDecoder.decodeRemovalReentryProtection(ByteToMessageDecoder.java:502)
>   at io.netty.handler.codec.ByteToMessageDecoder.callDecode(ByteToMessageDecoder.java:441)
>   at io.netty.handler.codec.ByteToMessageDecoder.channelRead(ByteToMessageDecoder.java:278)
>   at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:359)
>   at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:345)
>   at io.netty.channel.AbstractChannelHandlerContext.fireChannelRead(AbstractChannelHandlerContext.java:337)
>   at io.netty.channel.DefaultChannelPipeline$HeadContext.channelRead(DefaultChannelPipeline.java:1408)
>   at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:359)
>   at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:345)
>   at io.netty.channel.DefaultChannelPipeline.fireChannelRead(DefaultChannelPipeline.java:930)
>   at io.netty.channel.nio.AbstractNioByteChannel$NioByteUnsafe.read(AbstractNioByteChannel.java:163)
>   at io.netty.channel.nio.NioEventLoop.processSelectedKey(NioEventLoop.java:677)
>   at io.netty.channel.nio.NioEventLoop.processSelectedKeysOptimized(NioEventLoop.java:612)
>   at io.netty.channel.nio.NioEventLoop.processSelectedKeys(NioEventLoop.java:529)
>   at io.netty.channel.nio.NioEventLoop.run(NioEventLoop.java:491)
>   at io.netty.util.concurrent.SingleThreadEventExecutor$5.run(SingleThreadEventExecutor.java:905)
>   at io.netty.util.concurrent.FastThreadLocalRunnable.run(FastThreadLocalRunnable.java:30)
>   at java.base/java.lang.Thread.run(Thread.java:834)
> 

Analytics-Dashboard-Error

Console-page

Network-page

Request-page

@chirangaalwis