just warn if Heapster is not deployed (Minikube is missing it)

This commit is contained in:
Henning Jacobs
2017-01-15 18:36:49 +01:00
parent 49b150ef10
commit 5dc172e2fa
4 changed files with 24 additions and 21 deletions

View File

@@ -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

View File

@@ -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}

View File

@@ -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
message = get_short_error_message(e)
if isinstance(e, requests.exceptions.RequestException): if isinstance(e, requests.exceptions.RequestException):
message = get_short_error_message(e)
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
View 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)