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
from pathlib import Path
from urllib.parse import urljoin
import kubernetes.client
import kubernetes.config
import logging
import re
import requests
import tokens
from requests.auth import AuthBase

View File

@@ -4,6 +4,8 @@ from urllib.parse import urljoin
import requests
from .utils import get_short_error_message
logger = logging.getLogger(__name__)
session = requests.Session()
@@ -90,8 +92,8 @@ def query_kubernetes_cluster(cluster):
else:
for metrics in data['items']:
nodes[metrics['metadata']['name']]['usage'] = metrics['usage']
except:
logger.exception('Failed to get node metrics')
except Exception as e:
logger.warning('Failed to query node metrics {}: {}'.format(cluster.id, get_short_error_message(e)))
try:
response = request(cluster, '/api/v1/namespaces/kube-system/services/heapster/proxy/apis/metrics/v1alpha1/pods')
response.raise_for_status()
@@ -106,6 +108,6 @@ def query_kubernetes_cluster(cluster):
for container_metrics in metrics['containers']:
if container['name'] == container_metrics['name']:
container['resources']['usage'] = container_metrics['usage']
except:
logger.exception('Failed to get pod metrics')
except Exception as e:
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}

View File

@@ -6,6 +6,7 @@ import json_delta
import requests.exceptions
from .backoff import expo, random_jitter
from .utils import get_short_error_message
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)
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):
if not backoff:
backoff = {}
@@ -34,11 +22,10 @@ def handle_query_failure(e: Exception, cluster, backoff: dict):
backoff['tries'] = tries
wait_seconds = calculate_backoff(tries)
backoff['next_try'] = time.time() + wait_seconds
if isinstance(e, requests.exceptions.RequestException):
message = get_short_error_message(e)
if isinstance(e, requests.exceptions.RequestException):
log = logger.error
else:
message = str(e)
log = logger.exception
log('Failed to query cluster {} ({}): {} (try {}, wait {} seconds)'.format(
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)