[PYTHON] Je souhaite calculer le temps d'arrêt autorisé à partir du taux de fonctionnement

Souvent, les SLA, etc. parlent du taux de fonctionnement et des temps d'arrêt autorisés, mais je veux pouvoir le demander rapidement.

Mathématiquement, c'est comme suit.

Taux d'utilisation= \frac{Temps total-Temps d'échec}{Temps total}

Ainsi, par exemple, «Si le taux de fonctionnement est de 99%, combien de suspension est autorisée par mois ou par an?» Ne sort pas en chiffres, alors écrivons un programme pour qu'il puisse être calculé. Il a beaucoup de deuxième décoction, mais laissez-le tranquille.

J'aimerais l'écrire en Python.

supposition

Un mois correspond à 30 jours («24 x 60 x 60» secondes).

Un an équivaut à 365 jours («365 x 24 x 60 x 60» secondes).

Version Python confirmée.

$ python3 -V
Python 3.6.9

thème

Trouvez les trois suivants.

Rendez ce qui précède disponible à partir du taux de disponibilité, du temps d'arrêt mensuel autorisé ou du temps d'arrêt annuel autorisé.

Bref, je veux faire quelque chose qui cherche l'autre élément quand on est donné.

En outre, l'heure d'arrêt autorisée est exprimée en unités de «s» (secondes), «m» (minutes), «h» (heures) et «d» (jours) et, si elle est omise, elle doit être interprétée comme des secondes. Doit être.

Le résultat est sorti au format tabulaire Markdown.

programme

Voici celui que j'ai créé.

calc.py

import datetime

year_time =  365 * 24 * 60 * 60
month_time = 30 * 24 * 60 * 60

units = {"s": "seconds", "m": "minutes", "h": "hours", "d": "days"}

def calc_from_percentage(percentage):
    stop_time_per_year_raw = year_time * ((100 - percentage) / 100)
    stop_time_per_month_raw = month_time * ((100 - percentage) / 100)

    def format_time(time):
        if time > 24 * 60 * 60:
            formatted_time = f"{time / (24 * 60 * 60):.2f}journée"
        elif time > 60 * 60:
            formatted_time = f"{time / (60 * 60):.2f}temps"
        elif time > 60:
            formatted_time = f"{time / 60:.2f}Minutes"
        else:
            formatted_time = f"{time:.2f}Secondes"

        return formatted_time

    stop_time_per_year = format_time(stop_time_per_year_raw)
    stop_time_per_month = format_time(stop_time_per_month_raw)

    return (f"{percentage}%", stop_time_per_month, stop_time_per_year)

def calc_from_month_stop_time(stop_time):
    try:
        seconds = int(stop_time)
    except ValueError:
        t = int(stop_time[:-1])
        unit = units[stop_time[-1]]

        seconds = datetime.timedelta(**{unit: t}).total_seconds()
        
    percentage = 100 - ((seconds * 100) / month_time)
    return calc_from_percentage(percentage)

def calc_from_year_stop_time(stop_time):
    try:
        seconds = int(stop_time)
    except ValueError:
        t = int(stop_time[:-1])
        unit = units[stop_time[-1]]

        seconds = datetime.timedelta(**{unit: t}).total_seconds()
        
    percentage = 100 - ((seconds * 100) / year_time)
    return calc_from_percentage(percentage)

def print_table(percentages_or_stop_times, calc_func):
    print("|Taux d'utilisation|Temps d'arrêt mensuel autorisé|Temps d'arrêt annuel autorisé|")
    print("|:------:|:----------------:|:----------------:|")


    if isinstance(percentages_or_stop_times, list):
        targets = percentages_or_stop_times
    else:
        targets = [percentages_or_stop_times]

    for t in targets:
        result = calc_func(t)
        print(f"| {result[0]} | {result[1]} | {result[2]} |")

Comment utiliser

Chargez-le et lancez-le dans le shell interactif de Python.

$ python3 -i calc.py 
>>> 

Obtenez le temps d'arrêt autorisé à partir du taux de fonctionnement. Si vous voulez en donner plus d'un, utilisez la liste.

>>> print_table(99, calc_from_percentage)
|Taux d'utilisation|Temps d'arrêt mensuel autorisé|Temps d'arrêt annuel autorisé|
|:------:|:----------------:|:----------------:|
| 99% | 7.20 heures| 3.65 jours|


>>> print_table([90, 95, 99, 99.5, 99.9, 99.95, 99.99, 99.999, 99.9999], calc_from_percentage)
|Taux d'utilisation|Temps d'arrêt mensuel autorisé|Temps d'arrêt annuel autorisé|
|:------:|:----------------:|:----------------:|
| 90% | 3.00 jours| 36.50 jours|
| 95% | 1.50 jours| 18.25ème|
| 99% | 7.20 heures| 3.65 jours|
| 99.5% | 3.60 heures| 1.82e|
| 99.9% | 43.20 min| 8.76 heures|
| 99.95% | 21.60 minutes| 4.38 heures|
| 99.99% | 4.32 minutes| 52.56 minutes|
| 99.999% | 25.92 secondes| 5.26 minutes|
| 99.9999% | 2.59 secondes| 31.54 secondes|

C'est la table que je voulais.

Taux d'utilisation Temps d'arrêt mensuel autorisé Temps d'arrêt annuel autorisé
90% 3.00 jours 36.50 jours
95% 1.50 jours 18.25ème
99% 7.20 heures 3.65 jours
99.5% 3.60 heures 1.82e
99.9% 43.20 min 8.76 heures
99.95% 21.60 minutes 4.38 heures
99.99% 4.32 minutes 52.56 minutes
99.999% 25.92 secondes 5.26 minutes
99.9999% 2.59 secondes 31.54 secondes

Calculé à partir du temps d'arrêt mensuel autorisé.

>>> print_table("10", calc_from_month_stop_time)
|Taux d'utilisation|Temps d'arrêt mensuel autorisé|Temps d'arrêt annuel autorisé|
|:------:|:----------------:|:----------------:|
| 99.99961419753086% | 10.00 secondes| 2.03 minutes|


>>> print_table(["3d", "10m", "10s", "10"], calc_from_month_stop_time)
|Taux d'utilisation|Temps d'arrêt mensuel autorisé|Temps d'arrêt annuel autorisé|
|:------:|:----------------:|:----------------:|
| 90.0% | 3.00 jours| 36.50 jours|
| 99.97685185185185% | 10.00 minutes| 2.03 heures|
| 99.99961419753086% | 10.00 secondes| 2.03 minutes|
| 99.99961419753086% | 10.00 secondes| 2.03 minutes|

Je pensais que le nombre de chiffres du pourcentage serait bien cette fois ...

Calculé à partir du temps d'arrêt annuel autorisé.

>>> print_table("30d", calc_from_year_stop_time)
|Taux d'utilisation|Temps d'arrêt mensuel autorisé|Temps d'arrêt annuel autorisé|
|:------:|:----------------:|:----------------:|
| 91.78082191780823% | 2.47e| 30.00 jours|


>>> print_table(["30d", "45m", "30s", "30"], calc_from_year_stop_time)
|Taux d'utilisation|Temps d'arrêt mensuel autorisé|Temps d'arrêt annuel autorisé|
|:------:|:----------------:|:----------------:|
| 91.78082191780823% | 2.47e| 30.00 jours|
| 99.99143835616438% | 3.70 minutes| 45.00 minutes|
| 99.99990487062405% | 2.47 secondes| 30.00 secondes|
| 99.99990487062405% | 2.47 secondes| 30.00 secondes|

Comme ça.

Recommended Posts

Je souhaite calculer le temps d'arrêt autorisé à partir du taux de fonctionnement
Je veux voir le nom de fichier de DataLoader
Je veux trouver automatiquement des pièces de haute qualité à partir des vidéos que j'ai tournées
Je veux épingler Spyder à la barre des tâches
Je veux sortir froidement sur la console
Je veux gérer la rime part1
Je veux gérer la rime part3
Je veux utiliser jar de python
Je veux afficher la barre de progression
Je veux gérer la rime part2
Je veux gérer la rime part5
Je veux gérer la rime part4
Je souhaite envoyer un signal uniquement du sous-thread au thread principal
Je souhaite me connecter à PostgreSQL à partir de plusieurs langues
Je souhaite envoyer un e-mail depuis Gmail en utilisant Python.
[Python] Je veux gérer 7DaysToDie depuis Discord! 1/3
Je veux gérer la rime part7 (BOW)
Je veux faire des crises de ma tête
Je veux utiliser le solveur ceres de python
[Python] Je veux gérer 7DaysToDie depuis Discord! 2/3
Je veux créer du code C ++ à partir de code Python!
Je souhaite personnaliser l'apparence de zabbix
Je souhaite utiliser la fonction d'activation Mish
Je veux afficher la progression en Python!
[LINE Messaging API] Je souhaite envoyer un message du programme à tout le monde LINE
[Ansible] Je souhaite appeler ma propre fonction à partir du module de modèle (macro)
Je veux détecter des images de chats d'Instagram
J'ai essayé de détecter l'iris à partir de l'image de la caméra
Je veux grep le résultat de l'exécution de strace
Je voulais utiliser la bibliothèque Python de MATLAB
Je veux hériter de l'arrière avec la classe de données python
Je veux bien comprendre les bases de Bokeh
Je veux écrire en Python! (3) Utiliser des simulacres
Je veux gérer la rime part6 (organiser une fois)
Je veux automatiser ssh en utilisant la commande expect!
Je souhaite publier le produit au moindre coût
J'ai lu la référence Chainer (mise à jour de temps en temps)
Je veux utiliser le jeu de données R avec python
Je veux gérer la rime part8 (fini une fois)
Je souhaite augmenter la sécurité de la connexion SSH
[Python] J'ai créé un système pour introduire "la recette que je veux vraiment" depuis le site de recettes!
[TensorFlow] Je souhaite maîtriser l'indexation pour Ragged Tensor
Je veux initialiser si la valeur est vide (python)
Je veux changer la destination du lien symbolique de / lib64 de / usr / lib64 à / my-lib64 sur CentOS
Je souhaite enregistrer les photos envoyées par LINE vers S3
Je veux automatiser ssh en utilisant la commande expect! partie 2
maya Python Je veux réparer à nouveau l'animation cuite.
Je veux déplacer le sélénium pour le moment [pour mac]
Je veux démarrer beaucoup de processus à partir de python
Je souhaite utiliser uniquement le traitement de normalisation SudachiPy
Je veux obtenir des informations sur le fonctionnement de Yahoo Route
J'ai tweeté depuis le terminal!
Je veux changer le drapeau japonais en drapeau des Palaos avec Numpy
Comment calculer la quantité de calcul appris de ABC134-D
Je veux résoudre SUDOKU
[Python] Je souhaite utiliser l'option -h avec argparse
Je veux déterminer l'authenticité d'un élément du tableau numpy
Je veux installer le package de requirements.txt avec poésie
Je souhaite envoyer un message de Python à LINE Bot