1
1
import React , { useState } from 'react' ;
2
- import { Poll } from '@lumino/polling' ;
3
2
import { ISignal } from '@lumino/signaling' ;
4
3
import { ReactWidget , ISessionContext } from '@jupyterlab/apputils' ;
5
4
import { IChangedArgs } from '@jupyterlab/coreutils' ;
6
5
import { Kernel } from '@jupyterlab/services' ;
7
6
import { INotebookTracker , NotebookPanel } from '@jupyterlab/notebook' ;
8
7
import { requestAPI } from './handler' ;
8
+ import { KernelUsagePanel } from "./panel" ;
9
9
import useInterval from './useInterval' ;
10
10
import { formatForDisplay } from './format' ;
11
11
@@ -31,73 +31,31 @@ type Usage = {
31
31
32
32
const POLL_INTERVAL_SEC = 5 ;
33
33
34
- const POLL_MAX_INTERVAL_SEC = 300 ;
35
-
36
- type KernelPoll = {
37
- poll : Poll < void , any , 'stand-by' > ;
38
- path : string ;
39
- usage : Usage | undefined ;
40
- } ;
41
-
42
- const kernelPools = new Map < string , KernelPoll > ( ) ;
43
-
44
34
const KernelUsage = ( props : {
45
35
widgetAdded : ISignal < INotebookTracker , NotebookPanel | null > ;
46
36
currentNotebookChanged : ISignal < INotebookTracker , NotebookPanel | null > ;
37
+ panel : KernelUsagePanel ;
47
38
} ) => {
39
+ const { panel } = props ;
48
40
const [ kernelId , setKernelId ] = useState < string > ( ) ;
49
- const [ refresh , setRefresh ] = useState < boolean > ( true ) ;
41
+ const [ path , setPath ] = useState < string > ( ) ;
42
+ const [ usage , setUsage ] = useState < Usage | undefined > ( ) ;
50
43
51
44
useInterval ( async ( ) => {
52
- setRefresh ( ! refresh ) ;
45
+ if ( kernelId && panel . isVisible ) {
46
+ requestUsage ( kernelId ) . then ( usage => setUsage ( usage ) ) ;
47
+ }
53
48
} , POLL_INTERVAL_SEC * 1000 ) ;
54
49
55
- const requestUsage = async ( kernelId : string ) => {
56
- requestAPI < any > ( `get_usage/${ kernelId } ` )
57
- . then ( data => {
58
- const kernelPoll = kernelPools . get ( kernelId ) ;
59
- if ( kernelPoll ) {
60
- kernelPoll . usage = {
61
- ...data . content ,
62
- kernelId,
63
- timestamp : new Date ( )
64
- } ;
65
- kernelPools . set ( kernelId , kernelPoll ) ;
66
- }
67
- } )
68
- . catch ( reason => {
69
- console . error (
70
- `The kernelusage server extension has returned an error.\n${ reason } `
71
- ) ;
72
- const kernelPoll = kernelPools . get ( kernelId ) ;
73
- kernelPoll ?. poll . stop ( ) . then ( ( ) => {
74
- kernelPools . delete ( kernelId ) ;
75
- } ) ;
76
- } ) ;
77
- } ;
78
-
79
- const doPoll = ( kernelId : string , path : string ) => {
80
- let kernelPoll = kernelPools . get ( kernelId ) ;
81
- if ( ! kernelPoll ) {
82
- const poll = new Poll < void , any , 'stand-by' > ( {
83
- auto : true ,
84
- factory : ( ) => requestUsage ( kernelId ) ,
85
- frequency : {
86
- interval : POLL_INTERVAL_SEC * 1000 ,
87
- backoff : true ,
88
- max : POLL_MAX_INTERVAL_SEC * 1000
89
- } ,
90
- name : `@jupyterlab/kernel:KernelUsage#${ kernelId } ` ,
91
- standby : 'never'
92
- } ) ;
93
- kernelPoll = {
94
- poll,
95
- path,
96
- usage : undefined
50
+ const requestUsage = ( kid : string ) =>
51
+ requestAPI < any > ( `get_usage/${ kid } ` ) . then ( data => {
52
+ const usage : Usage = {
53
+ ...data . content ,
54
+ kernelId : kid ,
55
+ timestamp : new Date ( )
97
56
} ;
98
- kernelPools . set ( kernelId , kernelPoll ) ;
99
- }
100
- } ;
57
+ return usage ;
58
+ } ) ;
101
59
102
60
props . currentNotebookChanged . connect (
103
61
( sender : INotebookTracker , panel : NotebookPanel | null ) => {
@@ -110,17 +68,20 @@ const KernelUsage = (props: {
110
68
'kernel'
111
69
>
112
70
) => {
71
+ /*
113
72
const oldKernelId = args.oldValue?.id;
114
73
if (oldKernelId) {
115
74
const poll = kernelPools.get(oldKernelId);
116
75
poll?.poll.dispose();
117
76
kernelPools.delete(oldKernelId);
118
77
}
78
+ */
119
79
const newKernelId = args . newValue ?. id ;
120
80
if ( newKernelId ) {
121
81
setKernelId ( newKernelId ) ;
122
82
const path = panel ?. sessionContext . session ?. model . path ;
123
- doPoll ( newKernelId as string , path as string ) ;
83
+ setPath ( path ) ;
84
+ requestUsage ( newKernelId ) . then ( usage => setUsage ( usage ) ) ;
124
85
}
125
86
}
126
87
) ;
@@ -130,17 +91,17 @@ const KernelUsage = (props: {
130
91
if ( kernelId ) {
131
92
setKernelId ( kernelId ) ;
132
93
const path = panel ?. sessionContext . session ?. model . path ;
133
- doPoll ( kernelId as string , path ) ;
94
+ setPath ( path ) ;
95
+ requestUsage ( kernelId ) . then ( usage => setUsage ( usage ) ) ;
134
96
}
135
97
}
136
98
}
137
99
}
138
100
) ;
139
101
140
102
if ( kernelId ) {
141
- const kernelPool = kernelPools . get ( kernelId ) ;
142
- if ( kernelPool && kernelPool . usage ) {
143
- return ! kernelPool . usage . hostname ? (
103
+ if ( usage ) {
104
+ return ! usage . hostname ? (
144
105
< >
145
106
< h3 className = "jp-KernelUsage-section-separator" >
146
107
Kernel usage details are not available
@@ -154,60 +115,57 @@ const KernelUsage = (props: {
154
115
< >
155
116
< h3 className = "jp-KernelUsage-section-separator" > Kernel usage</ h3 >
156
117
< div className = "jp-KernelUsage-separator" >
157
- Kernel Host: { kernelPool . usage . hostname }
158
- </ div >
159
- < div className = "jp-KernelUsage-separator" >
160
- Notebook: { kernelPool . path }
118
+ Kernel Host: { usage . hostname }
161
119
</ div >
120
+ < div className = "jp-KernelUsage-separator" > Notebook: { path } </ div >
162
121
< div className = "jp-KernelUsage-separator" > Kernel ID: { kernelId } </ div >
163
122
< div className = "jp-KernelUsage-separator" >
164
- Timestamp: { kernelPool . usage . timestamp ?. toLocaleString ( ) }
123
+ Timestamp: { usage . timestamp ?. toLocaleString ( ) }
165
124
</ div >
166
125
< div className = "jp-KernelUsage-separator" >
167
- Process ID: { kernelPool . usage . pid }
126
+ Process ID: { usage . pid }
168
127
</ div >
169
128
< div className = "jp-KernelUsage-separator" >
170
- CPU: { kernelPool . usage . kernel_cpu }
129
+ CPU: { usage . kernel_cpu }
171
130
</ div >
172
131
< div className = "jp-KernelUsage-separator" >
173
- Memory: { formatForDisplay ( kernelPool . usage . kernel_memory ) }
132
+ Memory: { formatForDisplay ( usage . kernel_memory ) }
174
133
</ div >
175
134
< hr className = "jp-KernelUsage-section-separator" > </ hr >
176
135
< h4 className = "jp-KernelUsage-section-separator" > Host CPU</ h4 >
177
- < div className = "jp-KernelUsage-separator" >
178
- Percentage { kernelPool . usage . host_cpu_percent . toFixed ( 1 ) }
179
- </ div >
136
+ { usage . host_cpu_percent && (
137
+ < div className = "jp-KernelUsage-separator" >
138
+ Percentage { usage . host_cpu_percent . toFixed ( 1 ) }
139
+ </ div >
140
+ ) }
180
141
< h4 className = "jp-KernelUsage-section-separator" >
181
142
Host Virtual Memory
182
143
</ h4 >
183
144
< div className = "jp-KernelUsage-separator" >
184
- Active:{ ' ' }
185
- { formatForDisplay ( kernelPool . usage . host_virtual_memory . active ) }
186
- </ div >
187
- < div className = "jp-KernelUsage-separator" >
188
- Available:{ ' ' }
189
- { formatForDisplay ( kernelPool . usage . host_virtual_memory . available ) }
145
+ Active: { formatForDisplay ( usage . host_virtual_memory . active ) }
190
146
</ div >
191
147
< div className = "jp-KernelUsage-separator" >
192
- Free : { formatForDisplay ( kernelPool . usage . host_virtual_memory . free ) }
148
+ Available : { formatForDisplay ( usage . host_virtual_memory . available ) }
193
149
</ div >
194
150
< div className = "jp-KernelUsage-separator" >
195
- Inactive:{ ' ' }
196
- { formatForDisplay ( kernelPool . usage . host_virtual_memory . inactive ) }
151
+ Free: { formatForDisplay ( usage . host_virtual_memory . free ) }
197
152
</ div >
198
153
< div className = "jp-KernelUsage-separator" >
199
- Percent : { kernelPool . usage . host_virtual_memory . percent . toFixed ( 1 ) }
154
+ Inactive : { formatForDisplay ( usage . host_virtual_memory . inactive ) }
200
155
</ div >
156
+ { usage . host_virtual_memory . percent && (
157
+ < div className = "jp-KernelUsage-separator" >
158
+ Percent: { usage . host_virtual_memory . percent . toFixed ( 1 ) }
159
+ </ div >
160
+ ) }
201
161
< div className = "jp-KernelUsage-separator" >
202
- Total:{ ' ' }
203
- { formatForDisplay ( kernelPool . usage . host_virtual_memory . total ) }
162
+ Total: { formatForDisplay ( usage . host_virtual_memory . total ) }
204
163
</ div >
205
164
< div className = "jp-KernelUsage-separator" >
206
- Used: { formatForDisplay ( kernelPool . usage . host_virtual_memory . used ) }
165
+ Used: { formatForDisplay ( usage . host_virtual_memory . used ) }
207
166
</ div >
208
167
< div className = "jp-KernelUsage-separator" >
209
- Wired:{ ' ' }
210
- { formatForDisplay ( kernelPool . usage . host_virtual_memory . wired ) }
168
+ Wired: { formatForDisplay ( usage . host_virtual_memory . wired ) }
211
169
</ div >
212
170
</ >
213
171
) ;
@@ -222,20 +180,24 @@ export class KernelUsageWidget extends ReactWidget {
222
180
INotebookTracker ,
223
181
NotebookPanel | null
224
182
> ;
183
+ private _panel : KernelUsagePanel ;
225
184
constructor ( props : {
226
185
widgetAdded : ISignal < INotebookTracker , NotebookPanel | null > ;
227
186
currentNotebookChanged : ISignal < INotebookTracker , NotebookPanel | null > ;
187
+ panel : KernelUsagePanel ;
228
188
} ) {
229
189
super ( ) ;
230
190
this . _widgetAdded = props . widgetAdded ;
231
191
this . _currentNotebookChanged = props . currentNotebookChanged ;
192
+ this . _panel = props . panel ;
232
193
}
233
194
234
195
protected render ( ) : React . ReactElement < any > {
235
196
return (
236
197
< KernelUsage
237
198
widgetAdded = { this . _widgetAdded }
238
199
currentNotebookChanged = { this . _currentNotebookChanged }
200
+ panel = { this . _panel }
239
201
/>
240
202
) ;
241
203
}
0 commit comments