
    G%@iT                     d    d dl mZ d dlmZmZmZ d dlmZmZmZ d dl	m
Z
mZmZ  G d de
e      Zy)    )Optional)datetime	timedeltatimezone)JSONDecodeErrordumpsloads)PluginIndependentPlugin	PluginOptc            
           e Zd ZdZdZdZdZdZdZdZ	 e
dd	d
       e
dd	d       e
dd	d       e
dded       e
dded      gZdee   dee   fdZdee   dee   fdZd Zd Zd Zd Zd Zy )!Lokia
  
    Collects logs and configuration from Loki.

    This plugin interacts with the Loki API to fetch logs based on specified
    labels and provides options for pagination and label detection.
    It also collects relevant configuration files and masks sensitive
    information. It works with both charmed and non-charmed Loki.
    To fetch internal Loki logs, run it from the Loki container.
    You can also run it from another machine and fetch only logs from
    Loki API, by providing the following parameters:
        `-k loki.collect-logs=true -k loki.endpoint=LOKI_URL`

    Usage:
        sos report -o loki -k loki.collect-logs=true             -k loki.labels=severity:charm -k loki.detect-labels=true             -k loki.paginate=true -k loki.endpoint=LOKI_URL
    zLoki serviceloki)servicesi  d   )r   collect-logsFzcollect logs from Loki API)defaultdescdetect-labelszTfetch logs for all available labels. May result in multiple files with the same logspaginatez'fetch all available logs from Loki API.labels z1colon-delimited list of labels to fetch logs from)r   val_typer   endpointhttp://localhost:3100zDloki endpoint to fetch logs from. Defaults to http://localhost:3100.startendc                     |s#t        j                  t        j                        }|s|t	        d      z
  }|j                  d      }|j                  d      }d| d| d| d| dt        j                   d	}|S )
N   )daysz%Y-%m-%dT%H:%M:%S.%fZcurl -G -s 'z3/loki/api/v1/query_range' --data-urlencode 'query={z!=~".+"}' --data-urlencode 'start=z' --data-urlencode 'end=z' --data-urlencode 'limit=z' )r   nowr   utcr   strftimer   LOKI_QUERY_LIMIT)selfr   labelr   r   start_formattedend_formattedcommands           9/usr/lib/python3/dist-packages/sos/report/plugins/loki.pyquery_commandzLoki.query_command<   s    ,,x||,C)++E..)@A%<= 8* %)). 0''6&7 8%%2O 4''+'<'<&=R	A 	     c                     | j                  | j                  ||||            }	 t        |d         S # t        $ r | j	                  d| d       |d   cY S w xY w)Noutputz-An error was returned from Loki API on label z-. Error message stored, not querying further.)exec_cmdr,   r	   r   	_log_warn)r&   r   r'   r   r   r/   s         r+   get_logszLoki.get_logsO   ss    t11(E5#NO	$)** 	$NNK$g &JK M (##	$s   3 #AAc                     |d   d   }t        t        j                         j                         dz        }|D ]&  }|d   D ]  }t        |d         }t	        ||      } ( |S )Ndataresult ʚ;valuesr   )intr   r"   	timestampmin)r&   logslog_streamsearliest_logstreamlogr9   s          r+   get_earliest_log_timestampzLoki.get_earliest_log_timestamp[   sr    6l8,8<<>335mCD! 	<Fh' <AK	"<;<	< r-   c                    | j                  ||d d       }| j                  | d      5 }|j                  t        |d             d d d        t	        |t
              ry |r| j                  |      }t        t        j                         j                         dz        }d}|t        j                  k  r||k  rt        j                  |dz        }	| j                  ||d |	      }
| j                  | d|       5 }|j                  t        |
d             d d d        t	        |
t
              ry |}| j                  |
      }|dz  }|t        j                  k  r||k  ry y y y y # 1 sw Y   %xY w# 1 sw Y   ]xY w)Nz.log   )indentr6   r   z.log.r   )r2   collection_filewriter   
isinstancestrr@   r8   r   r"   r9   r   MAX_PAGINATION_ITERATIONSfromtimestamp)r&   r   r'   r   r;   logfiler=   previous_earliest_logiterations_countlog_timestampnew_logss              r+   get_logs_for_labelzLoki.get_logs_for_labele   s   }}XudD9!!UG4.1 	1WMM%Q/0	1dC ::4@L$'((*=8%!  !"T%C%CC #88 ( 6 6$0=$@!B==5$N))UG59I8J*KL ="MM%";<= h,(4%33H=  !A%  #T%C%CC #88 D8 D 	1 	1"= =s   E)=E6)E36E?c                 p   | j                  d      }| j                  |       | j                  d      }| j                  |       | j                  d       | j                  d       | j                  d      r| j                  d      xs d}g | _        | j                  d      x}r<t        |t              r,|r*| j                  j                  |j                  d	             | j                  d
      rB| j                  d| d      }t        |d         }| j                  j                  |d          y y y )Nz/etc/loki/*.yamlz/etc/worker/*.yamlz/var/log/loki/*zpebble logs loki -n 10000r   r   r   r   :r   r!   z/loki/api/v1/labels'r/   r4   )	path_joinadd_copy_specadd_cmd_output
get_optionr   rF   rG   extendsplitcollect_cmd_outputr	   )r&   els_config_filecoordinated_workers_config_filer   labels_option
labels_cmdlabels_jsons          r+   setupz
Loki.setup   s   ..);<?+ +/..9M*N':;,-78??>*z2M6MHDK $ 99}9mS1mKK&&}':':3'?@/!44"8*,@A
 $Jx$89"";v#67 0 +r-   c                     | j                  d      xs d}| j                  D ]&  }| j                  d      }| j                  |||       ( y )Nr   r   r   )rU   r   rO   )r&   r   r'   r   s       r+   collectzLoki.collect   sI    ??:.I2I[[ 	?Ez2H##HeX>	?r-   c                     ddg}g d}ddj                  |       d}ddj                  |       d}|D ](  }| j                  ||d       | j                  ||d       * y )	Naccess_key_idsecret_access_key)z /etc/loki/loki-local-config.yamlz/etc/loki/config.yamlz/etc/loki/local-config.yamlz/etc/loki/loki.yamlz/etc/worker/config.yaml(|z)\s*(:|=)(\S*\n.*?\\n)z)\s*(:|=)\s*[a-zA-Z0-9]*z\1\2*********)joindo_file_sub)r&   protect_keys
loki_filesmatch_exp_multil	match_expfiles         r+   postproczLoki.postproc   s    


   677MN,/00HI	 	D&  i 	r-   N)__name__
__module____qualname____doc__
short_descplugin_nameprofilesr%   rH   packagesr   rG   option_listr   r   r,   r2   r@   rO   r^   r`   rm    r-   r+   r   r      s    $  JKH #H 	.%3	5/5J	L 	*e@	B(BJ	L*&==	?KHX4F #H-&
$x/A 
$x(
$&>82?r-   r   N)typingr   r   r   r   jsonr   r   r	   sos.report.pluginsr
   r   r   r   rw   r-   r+   <module>r{      s-     2 2 . . C Ci6$ ir-   