Advertisement
dzocesrce

[NP] Services & Microservices

Apr 26th, 2025
212
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Java 7.51 KB | None | 0 0
  1. import java.util.Scanner;
  2. import java.util.HashMap;
  3. import java.util.Map;
  4. import java.util.stream.Collectors;
  5. import java.util.ArrayList;
  6. import java.util.List;
  7. import java.util.*;
  8.  
  9. class Microservice {
  10.     String microserviceName;
  11.     List<Log> logs;
  12.  
  13.     public Microservice(String microserviceName) {
  14.         this.microserviceName = microserviceName;
  15.         this.logs= new ArrayList<>();
  16.     }
  17.  
  18.     public String getMicroserviceName() {
  19.         return microserviceName;
  20.     }
  21.  
  22.  
  23.     public int getSerenity(){
  24.         return logs.stream().mapToInt(i->i.getLogSerenity()).sum();
  25.     }
  26.  
  27.     @Override
  28.     public String toString() {
  29.         StringBuilder stringBuilder= new StringBuilder();
  30.         for(Log l : logs){
  31.             stringBuilder.append(String.format("%s %s",microserviceName,l.toString()));
  32.         }
  33.         return stringBuilder.toString().trim();
  34.     }
  35. }
  36.  
  37. class Log {
  38.     String type;
  39.     String message;
  40.     int timestamp;
  41.  
  42.     public Log(String type, String message, int timestamp) {
  43.  
  44.         this.type = type;
  45.         this.message = message;
  46.         this.timestamp = timestamp;
  47.     }
  48.  
  49.  
  50.     public String getType() {
  51.         return type;
  52.     }
  53.  
  54.     public String getMessage() {
  55.         return message;
  56.     }
  57.  
  58.     public int getLogSerenity(){
  59.         int serenity=0;
  60.         if(type.equals("WARN")){
  61.             serenity++;
  62.             if(message.contains("might cause error"))
  63.                 serenity++;
  64.         }
  65.         else if(type.equals("ERROR")){
  66.             serenity+=3;
  67.             if(message.contains("fatal"))
  68.                 serenity+=2;
  69.             if(message.contains("exception"))
  70.                 serenity+=3;
  71.         }
  72.         return serenity;
  73.     }
  74.  
  75.     public int getTimestamp() {
  76.         return timestamp;
  77.     }
  78.  
  79.     @Override
  80.     public String toString() {
  81.         return String.format(" [%s]%s %d T:%d",type,message,timestamp,timestamp);
  82.     }
  83. }
  84.  
  85.  
  86. class LogCollector {
  87.     Map<String,Service> services;
  88.     public LogCollector() {
  89.         services= new HashMap<>();
  90.     }
  91.  
  92.     public void addLog(String log) {
  93.         String[] parts= log.split("\\s+");
  94.         String service = parts[0];
  95.         String microservice = parts[1];
  96.         String type = parts[2];
  97.         String message="";
  98.         for(int i=3;i<parts.length-1;i++){
  99.             message= message.concat(" "+parts[i]);
  100.         }
  101.         int timestamp= Integer.parseInt(parts[parts.length-1]);
  102.         services.putIfAbsent(service,new Service(service));
  103.         services.get(service).microservices.putIfAbsent(microservice,new Microservice(microservice));
  104.         services.get(service).microservices.get(microservice).logs.add(new Log(type,message,timestamp));
  105.  
  106.     }
  107.  
  108.     public void printServicesBySeverity() {
  109.         services.values().stream().sorted().forEach(i-> System.out.println(i));
  110.     }
  111.  
  112.     public Map<Integer, Long> getSeverityDistribution(String service, String microservice) {
  113.         if(microservice==null)
  114.             return services.get(service).microservices.values().stream().flatMap(list->list.logs.stream()).collect(Collectors.groupingBy(
  115.                     Log::getLogSerenity,
  116.                     Collectors.counting()
  117.             ));
  118.  
  119.         return services.get(service).microservices.get(microservice).logs.stream().collect(Collectors.groupingBy(
  120.                 Log::getLogSerenity,
  121.                 Collectors.counting()
  122.         ));
  123.     }
  124.  
  125.     public void displayLogs(String service, String microservice, String order) {
  126.  
  127.         Comparator<Log> OLDEST_FIRST = Comparator.comparing(Log::getTimestamp);
  128.         Comparator<Log> NEWEST_FIRST = OLDEST_FIRST.reversed();
  129.         Comparator<Log> LEAST_SEVERE_FIRST = Comparator.comparing(Log::getLogSerenity);
  130.         Comparator<Log> MOST_SEVERE_FIRST = LEAST_SEVERE_FIRST.reversed();
  131.         Comparator<Log> comparator;
  132.         if(order.equals("OLDEST_FIRST"))
  133.             comparator= OLDEST_FIRST;
  134.         else if(order.equals("NEWEST_FIRST"))
  135.             comparator= NEWEST_FIRST;
  136.         else if(order.equals("LEAST_SEVERE_FIRST"))
  137.             comparator= LEAST_SEVERE_FIRST;
  138.         else
  139.             comparator= MOST_SEVERE_FIRST;
  140.  
  141.         if(microservice==null){
  142.             System.out.println(String.format("displayLogs %s %s",service,order));
  143.             services.get(service).microservices.values()
  144.                     .stream().flatMap(list->list.logs.stream()).sorted(comparator).forEach(i-> System.out.println(String.format("%s%s",service,i.toString())));
  145.         }
  146.         else{
  147.             System.out.println(String.format("displayLogs %s %s %s",service,microservice,order));
  148.             services.get(service).microservices.get(microservice)
  149.                     .logs.stream().sorted(comparator).forEach(i-> System.out.println(String.format("%s|%s%s",service,microservice,i.toString())));
  150.         }
  151.        
  152.     }
  153. }
  154.  
  155. class Service implements Comparable<Service>{
  156.     String serviceName;
  157.     Map<String,Microservice> microservices;
  158.  
  159.     public int getSerenity(){
  160.         return microservices.values().stream().mapToInt(i->i.getSerenity()).sum();
  161.     }
  162.  
  163.     public double getAvgSerenity(){
  164.         return getSerenity()/(double)getNumberOfLogs();
  165.     }
  166.  
  167.     public int getNumberOfLogs(){
  168.         return (int)microservices.values().stream().flatMap(list->list.logs.stream()).count();
  169.     }
  170.  
  171.     public Service(String serviceName) {
  172.         this.serviceName = serviceName;
  173.         this.microservices = new HashMap<>();
  174.     }
  175.  
  176.     @Override
  177.     public String toString() {
  178.         return String.format("Service name: %s Count of microservices: %d " +
  179.                 "Total logs in service: %d Average severity for all logs: %.2f " +
  180.                 "Average number of logs per microservice: %.2f",serviceName, microservices.size(),getNumberOfLogs()
  181.                 ,getAvgSerenity(),getNumberOfLogs()/(double)microservices.size());
  182.     }
  183.  
  184.     @Override
  185.     public int compareTo(Service o) {
  186.         return Comparator.comparing(Service::getAvgSerenity).reversed().compare(this,o);
  187.     }
  188. }
  189.  
  190. public class LogsTester {
  191.     public static void main(String[] args) {
  192.         Scanner sc = new Scanner(System.in);
  193.         LogCollector collector = new LogCollector();
  194.         while (sc.hasNextLine()) {
  195.             String line = sc.nextLine();
  196.             if (line.startsWith("addLog")) {
  197.                 collector.addLog(line.replace("addLog ", ""));
  198.             } else if (line.startsWith("printServicesBySeverity")) {
  199.                 collector.printServicesBySeverity();
  200.             } else if (line.startsWith("getSeverityDistribution")) {
  201.                 String[] parts = line.split("\\s+");
  202.                 String service = parts[1];
  203.                 String microservice = null;
  204.                 if (parts.length == 3) {
  205.                     microservice = parts[2];
  206.                 }
  207.                 collector.getSeverityDistribution(service, microservice).forEach((k,v)-> System.out.printf("%d -> %d%n", k,v));
  208.             }
  209.            
  210.             else if (line.startsWith("displayLogs")){
  211.                 String[] parts = line.split("\\s+");
  212.                 String service = parts[1];
  213.                 String microservice = null;
  214.                 String order = null;
  215.                 if (parts.length == 4) {
  216.                     microservice = parts[2];
  217.                     order = parts[3];
  218.                 } else {
  219.                     order = parts[2];
  220.                 }
  221.                 collector.displayLogs(service, microservice, order);
  222.             }
  223.            
  224.         }
  225.     }
  226. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement