mirror of https://github.com/tikv/client-java.git
				
				
				
			Co-authored-by: Liangliang Gu <marsishandsome@gmail.com>
This commit is contained in:
		
							parent
							
								
									d24b8e9da7
								
							
						
					
					
						commit
						c75730e122
					
				|  | @ -7,7 +7,6 @@ header: | |||
|     - 'dev/' | ||||
|     - 'docs/' | ||||
|     - 'metrics/' | ||||
|     - 'scripts/' | ||||
|     - 'LICENSE' | ||||
|     - 'Makefile' | ||||
|     - 'pom.xml' | ||||
|  |  | |||
|  | @ -1,8 +1,6 @@ | |||
| # TiSpark Dev Tools Guide | ||||
| # TiKV Java Client Dev Tools | ||||
| 
 | ||||
| ## Formatting | ||||
| 
 | ||||
| ### Java Format | ||||
| ## Code Formatting | ||||
| 
 | ||||
| TiKV Java Client formats its code using [Google-Java-Format Maven Plugin](https://github.com/coveooss/fmt-maven-plugin) which follows Google's code styleguide. It is also checked on CI before build. | ||||
| 
 | ||||
|  |  | |||
							
								
								
									
										2
									
								
								pom.xml
								
								
								
								
							
							
						
						
									
										2
									
								
								pom.xml
								
								
								
								
							|  | @ -312,7 +312,7 @@ | |||
|                     <execution> | ||||
|                         <id>clone proto files</id> | ||||
|                         <configuration> | ||||
|                             <executable>${basedir}/scripts/proto.sh</executable> | ||||
|                             <executable>${basedir}/dev/proto.sh</executable> | ||||
|                         </configuration> | ||||
|                         <phase>validate</phase> | ||||
|                         <goals> | ||||
|  |  | |||
|  | @ -0,0 +1,77 @@ | |||
| #!/usr/bin/env python3 | ||||
| #!coding:utf-8 | ||||
| 
 | ||||
| # Copyright 2022 TiKV Project Authors. | ||||
| # | ||||
| # Licensed under the Apache License, Version 2.0 (the "License"); | ||||
| # you may not use this file except in compliance with the License. | ||||
| # You may obtain a copy of the License at | ||||
| # | ||||
| # http://www.apache.org/licenses/LICENSE-2.0 | ||||
| # | ||||
| # Unless required by applicable law or agreed to in writing, software | ||||
| # distributed under the License is distributed on an "AS IS" BASIS, | ||||
| # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | ||||
| # See the License for the specific language governing permissions and | ||||
| # limitations under the License. | ||||
| # | ||||
| 
 | ||||
| import re | ||||
| import json | ||||
| import argparse | ||||
| 
 | ||||
| def main(): | ||||
|     pattern = r'.*SlowLog:.*' | ||||
|     slowstr = "SlowLog:" | ||||
|     grpc_pattern = "gRPC tikvpb.Tikv" | ||||
|     backoff_pattern = "backoff " | ||||
| 
 | ||||
|     args = parse_args() | ||||
|     items = [] | ||||
|     with open(args.slowlog, encoding = 'utf-8') as f: | ||||
|         for line in f.readlines(): | ||||
|             matched = re.match(pattern, line, re.M|re.I) | ||||
|             if matched is not None: | ||||
|                 log = json.loads(line[(line.index(slowstr) + len(slowstr)):]) | ||||
|                 item = { | ||||
|                     'req': log['func'], | ||||
|                     'start': log['start'], | ||||
|                     'tot_lat': latency_ms(log), | ||||
|                     'tot_grpc': 0, | ||||
|                     'tot_bo': 0, | ||||
|                 } | ||||
|                 items.append(item) | ||||
|                 for span in log['spans']: | ||||
|                     if grpc_pattern in span['name'] and span['duration'] != 'N/A': | ||||
|                         item['tot_grpc'] += latency_ms(span) | ||||
|                     elif backoff_pattern in span['name'] and span['duration'] != 'N/A': | ||||
|                         item['tot_bo'] += latency_ms(span) | ||||
| 
 | ||||
|         if args.order == "total": | ||||
|             items = sorted(items, key=lambda d: d['tot_lat'], reverse=True) | ||||
|         elif args.order == "grpc": | ||||
|             items = sorted(items, key=lambda d: d['tot_grpc'], reverse=True) | ||||
|         elif args.order == "backoff": | ||||
|             items = sorted(items, key=lambda d: d['tot_bo'], reverse=True) | ||||
|         else: | ||||
|             print("unsupported order option, use default value: total") | ||||
|             items = sorted(items, key=lambda d: d['tot_lat'], reverse=True) | ||||
| 
 | ||||
|     fmtStr = "{:<12} {:<14} {:<14} {:<20} {:<20}" | ||||
|     print(fmtStr.format("Request", "Start", "Total Lat(ms)", "Total gRPC Lat(ms)", "Total Backoff Lat(ms)")) | ||||
|     for item in items: | ||||
|         print(fmtStr.format(item['req'], item['start'], item['tot_lat'], item['tot_grpc'], item['tot_bo'])) | ||||
| 
 | ||||
| def latency_ms(span): | ||||
|     return int(span['duration'][:len(span['duration'])-2]) | ||||
| 
 | ||||
| 
 | ||||
| def parse_args(): | ||||
|     parser = argparse.ArgumentParser(description="rstats: A TiKV Java Client Request Stats Analyzer") | ||||
|     parser.add_argument("-o", dest="order", default="total", help="order the output, default: total. accepted value: total, grpc, backoff") | ||||
|     parser.add_argument("slowlog", help="slow log file") | ||||
|     return parser.parse_args() | ||||
| 
 | ||||
| if __name__ == '__main__': | ||||
|     main() | ||||
| 
 | ||||
		Loading…
	
		Reference in New Issue