IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Bibliothèques & Frameworks Discussion :

Chartjs mise à jour timeRange a partir d'un Input ou Select [Chart.js]


Sujet :

Bibliothèques & Frameworks

  1. #1
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Septembre 2021
    Messages
    122
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 22
    Localisation : France, Charente (Poitou Charente)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Septembre 2021
    Messages : 122
    Points : 50
    Points
    50
    Par défaut Chartjs mise à jour timeRange a partir d'un Input ou Select
    Bonjour,

    Je suis en train de d'essayer d'intégrer des graphiques dans une page web dont les data proviennent de prometheus.
    Jusqu'à présent, en utilisant chart.umd.min.js + chartjs-adapter-date-fns.bundle.min.js + chartjs-plugin-datasource-prometheus.umd.min.js , j'arrive à afficher ce que je veux, mais j'aimerai ajouter la possibilité de modifier l'échelle de temps du graph.

    J'ai donc repris la structure du code en y ajoutant un champ, j'ai testé en Input, mais aussi en Select, pour y ajouter la valeur voulue (valeur négative). Cette valeur doit être utilisée dans la section "timeRange" à la valeur start.
    Quand je modifie en "manuel" cette valeur , par exemple : start : -10000, alors le graphe m'affiche correctement les 10 dernières secondes. Donc tout va bien. Par contre quand j'essaie avec la valeur provenant du formulaire, alors ça ne va pas. Le graph m'affiche :
    Failed to fetch data.
    Pour info les 2 autres champs du formulaire sont ok et prennent bien en compte les valeurs passées. Du coup je ne comprends pas pourquoi ça bloque. Si vous avez des idées je suis preneurs, ça fait 2 jours que je fais pleins de tests, et effectivement je ne suis pas à l'aise avec JS.

    En vous remerciant.

    Code html : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    	<script src="/staticFiles/chart.umd.min.js"></script>
    	<script src="/staticFiles/chartjs-adapter-date-fns.bundle.min.js"></script>
    	<script src="/staticFiles/chartjs-plugin-datasource-prometheus.umd.min.js"></script>
     
     
    			<div id="mastercenter_graph">
     
     
    			<div class="container">
    				<form id="refresh-form">
    					<input type="text" id="endpoint" placeholder="Prometheus endpoint">
    					<input type="text" id="query" placeholder="Prometheus query">
    					<input type="text" id="startval" placeholder="Start time">
     
    	<!--				<select id="start_time" placeholder="Prometheus start" >
    						<option value=-1000 >1s</option>
    						<option value=-10000 >10s</option>
    						<option value=-30000 >30s</option>
    						<option value=-300000 >5min</option>
    						<option value=-3600000 select="selected">1hr</option>
    						<option value=-86400000 >1j</option>
    					</select>			-->
    				  <button>Refresh</button>
    				</form>
    			</div>
     
    				<div id="myChart">
    					<canvas></canvas>
    				</div>				
     
    				<br></br>
     
    				<script>
                                    const form = document.querySelector('form#refresh-form');
                                    const endpointInput = document.querySelector('form#refresh-form input#endpoint');
                                    const queryInput = document.querySelector('form#refresh-form input#query');
                                    const startInput = document.querySelector('form#refresh-form input#startval');
                                    const ctx = document.querySelector('#myChart canvas').getContext('2d');
                                    
     
                                    
                                    endpointInput.value = 'http://192.168.1.80:9090/';
                                    queryInput.value = 'sum by (job) (memory_usage_p)';
                                    startInput.value = '-10000';
                                    
                                    const myChart = new Chart(ctx, {
                                            type: 'line',
                                            plugins: [ChartDatasourcePrometheusPlugin],
                                            options: {
                                                                                    
                                                    animation: {
                                                            duration: 0,
                                                    },
                                                    scales: {
                                                                    y: {
                                                                    suggestedMin: 0,
                                                                    suggestedMax: 100
                                                            }
                                                    },
                                                    legend: {
                                                                    display: true,
                                                                    labels: {
                                                                                    color: 'rgb(255, 99, 132)',
                                                                    }
                                                    },
                                                    plugins: {
                                                    
                                                                    subtitle: {
                                                                            display: false,
                                                                            text: 'Title of the Graph',
                                                                            color: 'rgb(255, 99, 132)',
                                                                    },
                                                    
     
                                                            'datasource-prometheus': {
                                                                    prometheus: {
                                                                            endpoint: endpointInput.value,
                                                                    },
                                                                    //query: ['node_load1', 'node_load5', 'node_load15'],
                                                                    query: queryInput.value,
                                                                    //query: customReq,
                                                                    timeRange: {
                                                                            type: 'relative',
                                                                            start: startInput.value,
                                                                            end: 0,
                                                                            step: 2,
                                                                            msUpdateInterval: 10000,
                                                                    },
                                                                    drawActiveElementsOnTop: false,
                                                                    tension: 0,  // Bezier curve tension of the line. Set to 0 to draw straightlines. This option is ignored if monotone cubic interpolation is used.
                                                                    fill: {
                                                                            target: 'origin',  // coloration under the line
                                                                            above: 'rgb(255, 182, 182)',   // Area will be red above the origin
                                                                            below: 'rgb(0, 0, 0)',    // And blue below the origin
                                                                    },
                                                                    
     
                                                            },
                                                    },
                                            },
                                    });
                                    
     
                                    form.addEventListener('submit', (event) => {
                                            event.preventDefault();
                                            myChart.options.plugins['datasource-prometheus'].prometheus.endpoint = endpointInput.value;
                                            myChart.options.plugins['datasource-prometheus'].query = queryInput.value;
                                            myChart.options.plugins['datasource-prometheus'].timeRange.start = startInput.value;
                                            myChart.update();
                                    });
                                                                    
                                    
                                    </script>

  2. #2
    Modérateur

    Avatar de NoSmoking
    Homme Profil pro
    Inscrit en
    Janvier 2011
    Messages
    17 075
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Isère (Rhône Alpes)

    Informations forums :
    Inscription : Janvier 2011
    Messages : 17 075
    Points : 44 656
    Points
    44 656
    Par défaut
    Bonjour,
    d'après lla documentation timeRange.start attend une valeur de type :
    Citation Envoyé par documentation
    Time range start: Date object (absolute) or integer (relative)
    Lorsque tu récupères la valeur d'une <option> d'un <select> celle-ci est une string. Il te faut donc la convertir avant de l'affecter à la propriété.
    Soit :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    myChart.options.plugins['datasource-prometheus'].timeRange.start = + startInput.value;
    soit :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    myChart.options.plugins['datasource-prometheus'].timeRange.start = Number(startInput.value);
    Ressources :

  3. #3
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Septembre 2021
    Messages
    122
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 22
    Localisation : France, Charente (Poitou Charente)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Septembre 2021
    Messages : 122
    Points : 50
    Points
    50
    Par défaut
    Bonjour, merci pour la réponse,

    J'ai tester quelques adaptations, sans pour autant avoir le résultat voulu. Dans le code ci après, en ajoutant une "alerte" dans le " form.addEventListener('submit' " je constate que la valeur associée à une sélection provenant de la liste de choix affiche : NaN.
    Dans le console de debugg j'observe aussi le NaN : http://190.10.1.80:9090/api/v1/query...683.393&step=3 , ce qui ne me rassure pas..
    J'ai essayé en mettant le " Number " a différents niveau, sans pour autant obtenir la valeur souhaitée.

    Voici le code corrigé, mais pas encore fonctionnel :

    Code html : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    			<form id="refresh-form">
    							<input type="text" id="endpoint" placeholder="Prometheus endpoint">
    							<input type="text" id="query" placeholder="Prometheus query">
    						<!--	<input type="text" id="startval" placeholder="Start time"> -->
     
    							<select id="startval" >
    								<option value=-1000 >1s</option>
    								<option value=-10000 >10s</option>
    								<option value=-30000 >30s</option>
    								<option value=-300000 >5min</option>
    								<option value=-3600000 select="selected">1hr</option>
    								<option value=-86400000 >1j</option>
    							</select>			
    						  <button>Refresh</button>
    						</form>
    					</div>
     
    					<div id="myChart">
    						<canvas></canvas>
    					</div>				
     
    					<br></br>
     
    					<script>
                                            const form = document.querySelector('form#refresh-form');
                                            const endpointInput = document.querySelector('form#refresh-form input#endpoint');
                                            const queryInput = document.querySelector('form#refresh-form input#query');
                                            const startInput = + document.querySelector('form#refresh-form select#startval');
                                            const ctx = document.querySelector('#myChart canvas').getContext('2d');
                                    
                                            endpointInput.value = 'http://192.168.1.80:9090/';
                                            queryInput.value = 'sum by (job) (memory_usage_p)';
                                            startInput.value = '-10000';
                                            
                                            const start = -1 * 60 * 60 * 100; //
                                            const end = 0; // now
                                            const step = 3;
                                            
                                            
                                            const myChart = new Chart(ctx, {
                                                    type: 'line',
                                                    plugins: [ChartDatasourcePrometheusPlugin],
                                                    options: {
                                                                                            
                                                            animation: {
                                                                    duration: 0,
                                                            },
                                                            scales: {
                                                                            y: {
                                                                            suggestedMin: 0,
                                                                            suggestedMax: 100
                                                                    }
                                                            },
                                                            legend: {
                                                                            display: true,
                                                                            labels: {
                                                                                            color: 'rgb(255, 99, 132)',
                                                                            }
                                                            },
                                                            plugins: {
                                                            
                                                                            subtitle: {
                                                                                    display: false,
                                                                                    text: 'Title of the Graph',
                                                                                    color: 'rgb(255, 99, 132)',
                                                                            },
                                                            
     
                                                                    'datasource-prometheus': {
                                                                            prometheus: {
                                                                                    endpoint: endpointInput.value,
                                                                            },
                                                                            //query: ['node_load1', 'node_load5', 'node_load15'],
                                                                            query: queryInput.value,
     
                                                                            timeRange: {
                                                                                    type: 'relative',
                                                                                    start: startInput,
                                                                                    end: end,
                                                                                    step: step,
                                                                                    msUpdateInterval: 10000,
                                                                            },
                                                                            drawActiveElementsOnTop: false,
                                                                            tension: 0,  // Bezier curve tension of the line. Set to 0 to draw straightlines. This option is ignored if monotone cubic interpolation is used.
                                                                            fill: {
                                                                                    target: 'origin',  // coloration under the line
                                                                                    above: 'rgb(255, 182, 182)',   // Area will be red above the origin
                                                                                    below: 'rgb(0, 0, 0)',    // And blue below the origin
                                                                            },
                                                                            
     
                                                                    },
                                                            },
                                                    },
                                            });
                                            
     
                                            form.addEventListener('submit', (event) => {
                                                    event.preventDefault();
                                                    myChart.options.plugins['datasource-prometheus'].prometheus.endpoint = endpointInput.value;
                                                    myChart.options.plugins['datasource-prometheus'].query = queryInput.value;
                                                    myChart.options.plugins['datasource-prometheus'].timeRange.start = Number(startInput);
                                                    alert(startInput);
                                                    myChart.update();
                                            });
                                                                            
                                            
                                            </script>

  4. #4
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Septembre 2021
    Messages
    122
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 22
    Localisation : France, Charente (Poitou Charente)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Septembre 2021
    Messages : 122
    Points : 50
    Points
    50
    Par défaut
    Ce code permet de récupérer une valeur "décimale" , pas encore la valeur souhaitée mais elle est bien prise en compte dans le graphique !
    Je passe donc de "NaN" à la valeur "0".

    Reste à comprendre la raison pourquoi les valeurs du select ne sont pas prises en compte.

    Code html : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    					<div class="container">
    						<form id="refresh-form">
    							<input type="text" id="endpoint" placeholder="Prometheus endpoint">
    							<input type="text" id="query" placeholder="Prometheus query">
    						<!--	<input type="text" id="startval" placeholder="Start time"> -->
     
    							<select id="startval" >
    								<option value=-1000 >1s</option>
    								<option value=-10000 >10s</option>
    								<option value=-30000 >30s</option>
    								<option value=-300000 >5min</option>
    								<option value=-3600000 select="selected">1hr</option>
    								<option value=-86400000 >1j</option>
    							</select>			
    						  <button>Refresh</button>
    						</form>
    					</div>
     
    					<div id="myChart">
    						<canvas></canvas>
    					</div>				
     
    					<br></br>
     
    					<script>
                                            const form = document.querySelector('form#refresh-form');
                                            const endpointInput = document.querySelector('form#refresh-form input#endpoint');
                                            const queryInput = document.querySelector('form#refresh-form input#query');
                                            const startInput = Number(document.querySelector('form#refresh-form input#startval'));
                                            const ctx = document.querySelector('#myChart canvas').getContext('2d');
                                    
                                            endpointInput.value = 'http://192.168.1.80:9090/';
                                            queryInput.value = 'sum by (job) (memory_usage_p)';
                                            //startInput.value = '-10000';
                                            
                                            
                                            const start = -1 * 60 * 60 * 100; //
                                            const end = 0; // now
                                            const step = 3;
                                            
                                            
                                            const myChart = new Chart(ctx, {
                                                    type: 'line',
                                                    plugins: [ChartDatasourcePrometheusPlugin],
                                                    options: {
                                                                                            
                                                            animation: {
                                                                    duration: 0,
                                                            },
                                                            scales: {
                                                                            y: {
                                                                            suggestedMin: 0,
                                                                            suggestedMax: 100
                                                                    }
                                                            },
                                                            legend: {
                                                                            display: true,
                                                                            labels: {
                                                                                            color: 'rgb(255, 99, 132)',
                                                                            }
                                                            },
                                                            plugins: {
                                                            
                                                                            subtitle: {
                                                                                    display: false,
                                                                                    text: 'Title of the Graph',
                                                                                    color: 'rgb(255, 99, 132)',
                                                                            },
                                                            
     
                                                                    'datasource-prometheus': {
                                                                            prometheus: {
                                                                                    endpoint: endpointInput.value,
                                                                            },
                                                                            //query: ['node_load1', 'node_load5', 'node_load15'],
                                                                            query: queryInput.value,
     
                                                                            timeRange: {
                                                                                    type: 'relative',
                                                                                    start: startInput,
                                                                                    end: end,
                                                                                    step: step,
                                                                                    msUpdateInterval: 10000,
                                                                            },
                                                                            drawActiveElementsOnTop: false,
                                                                            tension: 0,  // Bezier curve tension of the line. Set to 0 to draw straightlines. This option is ignored if monotone cubic interpolation is used.
                                                                            fill: {
                                                                                    target: 'origin',  // coloration under the line
                                                                                    above: 'rgb(255, 182, 182)',   // Area will be red above the origin
                                                                                    below: 'rgb(0, 0, 0)',    // And blue below the origin
                                                                            },
                                                                            
     
                                                                    },
                                                            },
                                                    },
                                            });
                                            
     
                                            form.addEventListener('submit', (event) => {
                                                    event.preventDefault();
                                                    myChart.options.plugins['datasource-prometheus'].prometheus.endpoint = endpointInput.value;
                                                    myChart.options.plugins['datasource-prometheus'].query = queryInput.value;
                                                    myChart.options.plugins['datasource-prometheus'].timeRange.start = startInput;
                                                    alert(startInput);
                                                    myChart.update();
                                            });
                                                                            
                                            
                                            </script>

  5. #5
    Modérateur

    Avatar de NoSmoking
    Homme Profil pro
    Inscrit en
    Janvier 2011
    Messages
    17 075
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Isère (Rhône Alpes)

    Informations forums :
    Inscription : Janvier 2011
    Messages : 17 075
    Points : 44 656
    Points
    44 656
    Par défaut
    Ce que j'ai écris :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    myChart.options.plugins['datasource-prometheus'].timeRange.start = Number(startInput.value);
    ce que tu écris :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    myChart.options.plugins['datasource-prometheus'].timeRange.start = Number(startInput);
    startInput c'est l'élément DOM ...

  6. #6
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Septembre 2021
    Messages
    122
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 22
    Localisation : France, Charente (Poitou Charente)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Septembre 2021
    Messages : 122
    Points : 50
    Points
    50
    Par défaut
    Oui je l'ai intégré, mais comme ça ne fonctionnait pas j'ai testé d'autres cas...

    Donc avec :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    					form.addEventListener('submit', (event) => {
    						event.preventDefault();
    						myChart.options.plugins['datasource-prometheus'].prometheus.endpoint = endpointInput.value;
    						myChart.options.plugins['datasource-prometheus'].query = queryInput.value;
    						myChart.options.plugins['datasource-prometheus'].timeRange.start = Number(startInput.value);
    						alert(startInput);
    						myChart.update();
    					});
    ça me renvoie : "failed to fetch data" dans le graph display.
    en plus la requete reprend la valeur "NaN" dans la console debugg :
    http://192.168.1.80:9090/api/v1/query_range?query=sum by (job) (memory_usage_p)&start=NaN&end=1717502024.057&step=3
    Je continue à gratter , ça fait 2 jours déjà, mais je ne laisse pas tomber !!

    En tout cas merci pour le support.

  7. #7
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Septembre 2021
    Messages
    122
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 22
    Localisation : France, Charente (Poitou Charente)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Septembre 2021
    Messages : 122
    Points : 50
    Points
    50
    Par défaut
    Bonjour,

    Bon alors j'ai réussi à atteindre mon objectif, moyennant galère et tests à tout va, par contre si quelqu'un est capable de me confirmer que tout ça est "propre" ça serait cool !

    En vous remerciant.

    pour expliquer, j'ai récupéré la valeur du select en mettant après l'affichage du graph ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    					var elt = document.querySelector('select');
    					elt.addEventListener('change', function () {
    						console.log('value => '+this.value);
    						myChart.options.plugins['datasource-prometheus'].timeRange.start = + this.value;
    						myChart.update();
    					})
    et dans le code complet ça donne :
    Code html : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    					<div class="container">
    						<form id="refresh-form">
    							<input type="text" id="endpoint" placeholder="Prometheus endpoint">
    							<input type="text" id="query" placeholder="Prometheus query">
    						<!--	<input type="text" id="startval" placeholder="Start time"> -->
     
    							<select id="startval" >
    								<option value=-1000 >1s</option>
    								<option value=-10000 >10s</option>
    								<option value=-30000 >30s</option>
    								<option value=-300000 >5min</option>
    								<option value=-3600000 select="selected">1hr</option>
    								<option value=-86400000 >1j</option>
    							</select>			
    						  <button>Refresh</button>
    						</form>
    					</div>
     
    					<div id="myChart">
    						<canvas></canvas>
    					</div>				
     
    					<br></br>
     
    					<script>
                                            const form = document.querySelector('form#refresh-form');
                                            const endpointInput = document.querySelector('form#refresh-form input#endpoint');
                                            const queryInput = document.querySelector('form#refresh-form input#query');
                                            const startInput = Number(document.querySelector('form#refresh-form input#startval'));
                                            const test = document.querySelector('form#refresh-form select#startval');
                                            const ctx = document.querySelector('#myChart canvas').getContext('2d');
                                            
                                            alert("test = " + test);
                                    
                                            endpointInput.value = 'http://192.168.1.80:9090/';
                                            queryInput.value = 'sum by (job) (memory_usage_p)';
                                            //startInput.value = '-10000';
                                            
                                            
                                            const start = -1 * 60 * 60 * 100; //
                                            const end = 0; // now
                                            const step = 3;
                                            
                                            
                                            const myChart = new Chart(ctx, {
                                                    type: 'line',
                                                    plugins: [ChartDatasourcePrometheusPlugin],
                                                    options: {
                                                                                            
                                                            animation: {
                                                                    duration: 0,
                                                            },
                                                            scales: {
                                                                            y: {
                                                                            suggestedMin: 0,
                                                                            suggestedMax: 100
                                                                    }
                                                            },
                                                            legend: {
                                                                            display: true,
                                                                            labels: {
                                                                                            color: 'rgb(255, 99, 132)',
                                                                            }
                                                            },
                                                            plugins: {
                                                            
                                                                            subtitle: {
                                                                                    display: false,
                                                                                    text: 'Title of the Graph',
                                                                                    color: 'rgb(255, 99, 132)',
                                                                            },
                                                            
     
                                                                    'datasource-prometheus': {
                                                                            prometheus: {
                                                                                    endpoint: endpointInput.value,
                                                                            },
                                                                            //query: ['node_load1', 'node_load5', 'node_load15'],
                                                                            query: queryInput.value,
     
                                                                            timeRange: {
                                                                                    type: 'relative',
                                                                                    start: startInput,
                                                                                    end: end,
                                                                                    step: step,
                                                                                    msUpdateInterval: 10000,
                                                                            },
                                                                            drawActiveElementsOnTop: false,
                                                                            tension: 0,  // Bezier curve tension of the line. Set to 0 to draw straightlines. This option is ignored if monotone cubic interpolation is used.
                                                                            fill: {
                                                                                    target: 'origin',  // coloration under the line
                                                                                    above: 'rgb(255, 182, 182)',   // Area will be red above the origin
                                                                                    below: 'rgb(0, 0, 0)',    // And blue below the origin
                                                                            },
                                                                            
     
                                                                    },
                                                            },
                                                    },
                                            });
                                            
                                            
                                            var elt = document.querySelector('select');
                                            elt.addEventListener('change', function () {
                                                    console.log('value => '+this.value);
                                                    myChart.options.plugins['datasource-prometheus'].timeRange.start = + this.value;
                                                    myChart.update();
                                            })
     
     
                                            form.addEventListener('submit', (event) => {
                                                    event.preventDefault();
                                                    myChart.options.plugins['datasource-prometheus'].prometheus.endpoint = endpointInput.value;
                                                    myChart.options.plugins['datasource-prometheus'].query = queryInput.value;
                                                    //myChart.options.plugins['datasource-prometheus'].timeRange.start = startInput;
                                                    alert(startInput);
                                                    myChart.update();
                                            });
                                                                            
                                            
                                            </script>


    C'est cool quand ça fonctionne !!

  8. #8
    Modérateur

    Avatar de NoSmoking
    Homme Profil pro
    Inscrit en
    Janvier 2011
    Messages
    17 075
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Isère (Rhône Alpes)

    Informations forums :
    Inscription : Janvier 2011
    Messages : 17 075
    Points : 44 656
    Points
    44 656
    Par défaut
    C'est cool quand ça fonctionne !!
    c'est un fait effectivement !


    par contre si quelqu'un est capable de me confirmer que tout ça est "propre" ça serait cool !
    Visiblement tu t'es mélangé les pinceaux entre l'objet DOM et sa valeur.

    Plusieurs remarques, mais pour commencer et concernant le HTML, autant écrire du HTML respectant les « conventions » soit pour ton <select> :
    Code html : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    <select id="startval">
      <option value="-1000">1s</option>
      <option value="-10000">10s</option>
      <option value="-30000">30s</option>
      <option value="-300000">5min</option>
      <option value="-3600000" selected>1hr</option>
      <option value="-86400000">1j</option>
    </select>
    Concernant la méthode de récupération des différents éléments du DOM, et attendu qu'une ID doit être unique, l'utilisation de sélecteur comme : form#refresh-form input#startval est une aberration

    Au passage const startInput = Number(document.querySelector('form#refresh-form input#startval')) n'a aucun sens et se traduit par Number(elementDOM) => NaN.

    Pour en revenir, il suffit d'écrire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    const startElement = document.getElementById("startval");
    ... en lieu et place de :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    const startElement = Number(document.querySelector('form#refresh-form input#startval'));
    La récupération de tes différents éléments se résume à :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    const formElement = document.getElementById("refresh-form");
    const queryElement = document.getElementById("query");
    const endpointElement = document.getElementById("endpoint");
    const startElement = document.getElementById("startval");
    L'initialisation de ta carte devient :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    const myChart = new Chart(ctx, {
      type: "line",
      plugins: [ChartDatasourcePrometheusPlugin],
      options: {
        animation: {
          duration: 0,
        },
        scales: {},
        plugins: {
          "datasource-prometheus": {
            prometheus: {
              endpoint: endpointElement.value,
            },
            query: queryElement.value,
            timeRange: {
              type: "relative",
              start: Number(startElement.value), // attention require integer !
              end: 0,
            },
          },
        },
      },
    });
    ... pas grand chose de changé.

    Concerant le lancement de la mise à jour tu pourrais avoir une fonction updateChart comme suit :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    function updateChart(event){
      event.preventDefault();
      const plugin = myChart.options.plugins["datasource-prometheus"];
      // récup. des différents valeurs
      plugin.query = queryElement.value;
      plugin.prometheus.endpoint = endpointElement.value;
      plugin.timeRange.start = Number(startElement.value);
      myChart.update();
    }
    ... cela te permet d'affecter plusieurs événements, si besoin, avec cette même fonction comme :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    formElement.addEventListener("change", updateChart);
    formElement.addEventListener("submit", updateChart);  // si on garde le button dans le formulaire
    En résumé le script final pourrait ressembler à :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    // récup. éléments DOM utiles
    const ctx = document.querySelector('#myChart canvas').getContext('2d');
    const formElement = document.getElementById("refresh-form");
    const queryElement = document.getElementById("query");
    const endpointElement = document.getElementById("endpoint");
    const startElement = document.getElementById("startval");
     
    // init des champs
    endpointElement.value = "https://prometheus.demo.do.prometheus.io/";
    queryElement.value = "sum by (job) (go_gc_duration_seconds)";
     
    // création de la Chart
    const myChart = new Chart(ctx, {
      type: "line",
      plugins: [ChartDatasourcePrometheusPlugin],
      options: {
        animation: {
          duration: 0,
        },
        scales: {},
        plugins: {
          "datasource-prometheus": {
            prometheus: {
              endpoint: endpointElement.value,
            },
            query: queryElement.value,
            timeRange: {
              type: "relative",
              start: Number(startElement.value), // attention require integer !
              end: 0,
            },
          },
        },
      },
    });
     
    function updateChart(event){
      event.preventDefault();
      const plugin = myChart.options.plugins["datasource-prometheus"];
      // récup. des différents valeurs
      plugin.query = queryElement.value;
      plugin.prometheus.endpoint = endpointElement.value;
      plugin.timeRange.start = Number(startElement.value);
      myChart.update();
    }
    formElement.addEventListener("change", updateChart);
    formElement.addEventListener("submit", updateChart);  // si on garde le button dans le formulaire
    Voilà

  9. #9
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Septembre 2021
    Messages
    122
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 22
    Localisation : France, Charente (Poitou Charente)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Septembre 2021
    Messages : 122
    Points : 50
    Points
    50
    Par défaut
    Bonjour, merci pour toutes les explications.

    Je vais tacher de bien relire et comprendre et je vais faire une mise à jour !

    Encore merci.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Mise à jour formulaire à partir d'une requête
    Par Pwouaro dans le forum VBA Access
    Réponses: 9
    Dernier message: 15/02/2008, 13h53
  2. Réponses: 3
    Dernier message: 10/12/2007, 14h03
  3. annuler mise à jour table à partir formulaire
    Par Daniel MOREAU dans le forum VBA Access
    Réponses: 3
    Dernier message: 05/07/2007, 06h57
  4. Mise à jour table à partir sous-formulaire
    Par Daniel MOREAU dans le forum Access
    Réponses: 6
    Dernier message: 19/05/2006, 09h26
  5. Mise à jour Pro à partir de licence Etudiant ?
    Par Neilos dans le forum C++Builder
    Réponses: 3
    Dernier message: 15/11/2005, 16h03

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo