just warn if Heapster is not deployed (Minikube is missing it)
This commit is contained in:
@@ -1,11 +1,11 @@
|
|||||||
|
import logging
|
||||||
|
import re
|
||||||
import time
|
import time
|
||||||
from pathlib import Path
|
from pathlib import Path
|
||||||
from urllib.parse import urljoin
|
from urllib.parse import urljoin
|
||||||
|
|
||||||
import kubernetes.client
|
import kubernetes.client
|
||||||
import kubernetes.config
|
import kubernetes.config
|
||||||
import logging
|
|
||||||
import re
|
|
||||||
import requests
|
import requests
|
||||||
import tokens
|
import tokens
|
||||||
from requests.auth import AuthBase
|
from requests.auth import AuthBase
|
||||||
|
|||||||
@@ -4,6 +4,8 @@ from urllib.parse import urljoin
|
|||||||
|
|
||||||
import requests
|
import requests
|
||||||
|
|
||||||
|
from .utils import get_short_error_message
|
||||||
|
|
||||||
logger = logging.getLogger(__name__)
|
logger = logging.getLogger(__name__)
|
||||||
|
|
||||||
session = requests.Session()
|
session = requests.Session()
|
||||||
@@ -90,8 +92,8 @@ def query_kubernetes_cluster(cluster):
|
|||||||
else:
|
else:
|
||||||
for metrics in data['items']:
|
for metrics in data['items']:
|
||||||
nodes[metrics['metadata']['name']]['usage'] = metrics['usage']
|
nodes[metrics['metadata']['name']]['usage'] = metrics['usage']
|
||||||
except:
|
except Exception as e:
|
||||||
logger.exception('Failed to get node metrics')
|
logger.warning('Failed to query node metrics {}: {}'.format(cluster.id, get_short_error_message(e)))
|
||||||
try:
|
try:
|
||||||
response = request(cluster, '/api/v1/namespaces/kube-system/services/heapster/proxy/apis/metrics/v1alpha1/pods')
|
response = request(cluster, '/api/v1/namespaces/kube-system/services/heapster/proxy/apis/metrics/v1alpha1/pods')
|
||||||
response.raise_for_status()
|
response.raise_for_status()
|
||||||
@@ -106,6 +108,6 @@ def query_kubernetes_cluster(cluster):
|
|||||||
for container_metrics in metrics['containers']:
|
for container_metrics in metrics['containers']:
|
||||||
if container['name'] == container_metrics['name']:
|
if container['name'] == container_metrics['name']:
|
||||||
container['resources']['usage'] = container_metrics['usage']
|
container['resources']['usage'] = container_metrics['usage']
|
||||||
except:
|
except Exception as e:
|
||||||
logger.exception('Failed to get pod metrics')
|
logger.warning('Failed to query pod metrics for cluster {}: {}'.format(cluster.id, get_short_error_message(e)))
|
||||||
return {'id': cluster_id, 'api_server_url': api_server_url, 'nodes': nodes, 'unassigned_pods': unassigned_pods}
|
return {'id': cluster_id, 'api_server_url': api_server_url, 'nodes': nodes, 'unassigned_pods': unassigned_pods}
|
||||||
|
|||||||
@@ -6,6 +6,7 @@ import json_delta
|
|||||||
import requests.exceptions
|
import requests.exceptions
|
||||||
|
|
||||||
from .backoff import expo, random_jitter
|
from .backoff import expo, random_jitter
|
||||||
|
from .utils import get_short_error_message
|
||||||
|
|
||||||
logger = logging.getLogger(__name__)
|
logger = logging.getLogger(__name__)
|
||||||
|
|
||||||
@@ -14,19 +15,6 @@ def calculate_backoff(tries: int):
|
|||||||
return random_jitter(expo(tries, factor=2, max_value=60), jitter=4)
|
return random_jitter(expo(tries, factor=2, max_value=60), jitter=4)
|
||||||
|
|
||||||
|
|
||||||
def get_short_error_message(e: requests.exceptions.RequestException):
|
|
||||||
'''Generate a reasonable short message why the HTTP request failed'''
|
|
||||||
|
|
||||||
if e.response is not None:
|
|
||||||
# e.g. "401 Unauthorized"
|
|
||||||
return '{} {}'.format(e.response.status_code, e.response.reason)
|
|
||||||
elif isinstance(e, requests.exceptions.ConnectionError):
|
|
||||||
# e.g. "ConnectionError" or "ConnectTimeout"
|
|
||||||
return e.__class__.__name__
|
|
||||||
else:
|
|
||||||
return str(e)
|
|
||||||
|
|
||||||
|
|
||||||
def handle_query_failure(e: Exception, cluster, backoff: dict):
|
def handle_query_failure(e: Exception, cluster, backoff: dict):
|
||||||
if not backoff:
|
if not backoff:
|
||||||
backoff = {}
|
backoff = {}
|
||||||
@@ -34,11 +22,10 @@ def handle_query_failure(e: Exception, cluster, backoff: dict):
|
|||||||
backoff['tries'] = tries
|
backoff['tries'] = tries
|
||||||
wait_seconds = calculate_backoff(tries)
|
wait_seconds = calculate_backoff(tries)
|
||||||
backoff['next_try'] = time.time() + wait_seconds
|
backoff['next_try'] = time.time() + wait_seconds
|
||||||
if isinstance(e, requests.exceptions.RequestException):
|
|
||||||
message = get_short_error_message(e)
|
message = get_short_error_message(e)
|
||||||
|
if isinstance(e, requests.exceptions.RequestException):
|
||||||
log = logger.error
|
log = logger.error
|
||||||
else:
|
else:
|
||||||
message = str(e)
|
|
||||||
log = logger.exception
|
log = logger.exception
|
||||||
log('Failed to query cluster {} ({}): {} (try {}, wait {} seconds)'.format(
|
log('Failed to query cluster {} ({}): {} (try {}, wait {} seconds)'.format(
|
||||||
cluster.id, cluster.api_server_url, message, tries, round(wait_seconds)))
|
cluster.id, cluster.api_server_url, message, tries, round(wait_seconds)))
|
||||||
|
|||||||
14
kube_ops_view/utils.py
Normal file
14
kube_ops_view/utils.py
Normal file
@@ -0,0 +1,14 @@
|
|||||||
|
import requests.exceptions
|
||||||
|
|
||||||
|
|
||||||
|
def get_short_error_message(e: Exception):
|
||||||
|
'''Generate a reasonable short message why the HTTP request failed'''
|
||||||
|
|
||||||
|
if isinstance(e, requests.exceptions.RequestException) and e.response is not None:
|
||||||
|
# e.g. "401 Unauthorized"
|
||||||
|
return '{} {}'.format(e.response.status_code, e.response.reason)
|
||||||
|
elif isinstance(e, requests.exceptions.ConnectionError):
|
||||||
|
# e.g. "ConnectionError" or "ConnectTimeout"
|
||||||
|
return e.__class__.__name__
|
||||||
|
else:
|
||||||
|
return str(e)
|
||||||
Reference in New Issue
Block a user