1
1
import json
2
2
import time
3
- from datetime import datetime
3
+ from datetime import datetime , timedelta
4
4
5
5
from roboflow .adapters import deploymentapi
6
6
from roboflow .config import load_roboflow_api_key
@@ -19,6 +19,7 @@ def add_deployment_parser(subparsers):
19
19
)
20
20
deployment_list_parser = deployment_subparsers .add_parser ("list" , help = "list dedicated deployments in a workspace" )
21
21
deployment_delete_parser = deployment_subparsers .add_parser ("delete" , help = "delete a dedicated deployment" )
22
+ deployment_log_parser = deployment_subparsers .add_parser ("log" , help = "show log info for a dedicated deployment" )
22
23
23
24
deployment_machine_type_parser .set_defaults (func = list_machine_types )
24
25
deployment_machine_type_parser .add_argument ("-a" , "--api_key" , help = "api key" )
@@ -68,6 +69,14 @@ def add_deployment_parser(subparsers):
68
69
deployment_delete_parser .set_defaults (func = delete_deployment )
69
70
deployment_delete_parser .add_argument ("-a" , "--api_key" , help = "api key" )
70
71
deployment_delete_parser .add_argument ("deployment_name" , help = "deployment name" )
72
+
73
+ deployment_log_parser .set_defaults (func = get_deployment_log )
74
+ deployment_log_parser .add_argument ("-a" , "--api_key" , help = "api key" )
75
+ deployment_log_parser .add_argument ("deployment_name" , help = "deployment name" )
76
+ deployment_log_parser .add_argument ("-d" , "--duration" , help = "duration of log (from now) in seconds" , type = int , default = 3600 )
77
+ deployment_log_parser .add_argument (
78
+ "-f" , "--follow" , help = "follow log output" , action = "store_true"
79
+ )
71
80
72
81
73
82
def list_machine_types (args ):
@@ -149,3 +158,33 @@ def delete_deployment(args):
149
158
print (f"{ status_code } : { msg } " )
150
159
return
151
160
print (json .dumps (msg , indent = 2 ))
161
+
162
+
163
+ def get_deployment_log (args ):
164
+ api_key = args .api_key or load_roboflow_api_key (None )
165
+ if api_key is None :
166
+ print ("Please provide an api key" )
167
+ return
168
+
169
+ to_timestamp = datetime .now ()
170
+ from_timestamp = (to_timestamp - timedelta (seconds = args .duration ))
171
+ log_ids = set () # to avoid duplicate logs
172
+ while True :
173
+ status_code , msg = deploymentapi .get_deployment_log (api_key , args .deployment_name , from_timestamp , to_timestamp )
174
+ if status_code != 200 :
175
+ print (f"{ status_code } : { msg } " )
176
+ return
177
+
178
+ for log in msg [::- 1 ]: # logs are sorted by reversed timestamp
179
+ if log ['insert_id' ] in log_ids :
180
+ continue
181
+ log_ids .add (log ['insert_id' ])
182
+ print (f'[{ datetime .fromisoformat (log ["timestamp" ]).strftime ("%Y-%m-%d %H:%M:%S.%f" )} ] { log ["payload" ]} ' )
183
+
184
+ if not args .follow :
185
+ break
186
+
187
+ time .sleep (10 )
188
+ from_timestamp = to_timestamp
189
+ to_timestamp = datetime .now ()
190
+
0 commit comments