feat(writeData): adding intel_rdt and ras telegraf plugins (#19746)

* feat(writeData): adding intel_rdt and ras telegraf plugins

* fix: typo in exec.md

* fix(ras): update RAS name
pull/19748/head
Russ Savage 2020-10-14 11:18:11 -07:00 committed by GitHub
parent 155fa72b34
commit b60331b82e
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
16 changed files with 1812 additions and 23 deletions

View File

@ -58,6 +58,13 @@ API endpoint. In the following order the plugin will attempt to authenticate.
## gaps or overlap in pulled data
interval = "5m"
## Recommended if "delay" and "period" are both within 3 hours of request time. Invalid values will be ignored.
## Recently Active feature will only poll for CloudWatch ListMetrics values that occurred within the last 3 Hours.
## If enabled, it will reduce total API usage of the CloudWatch ListMetrics API and require less memory to retain.
## Do not enable if "period" or "delay" is longer than 3 hours, as it will not return data more than 3 hours old.
## See https://docs.aws.amazon.com/AmazonCloudWatch/latest/APIReference/API_ListMetrics.html
#recently_active = "PT3H"
## Configure the TTL for the internal cache of metrics.
# cache_ttl = "1h"
@ -150,7 +157,7 @@ To maximize efficiency and savings, consider making fewer requests by increasing
### Measurements & Fields:
Each CloudWatch Namespace monitored records a measurement with fields for each available Metric Statistic
Each CloudWatch Namespace monitored records a measurement with fields for each available Metric Statistic.
Namespace and Metrics are represented in [snake case](https://en.wikipedia.org/wiki/Snake_case)
- cloudwatch_{namespace}

View File

@ -17,6 +17,14 @@ report those stats already using StatsD protocol if needed.
## URI scheme for the Consul server, one of "http", "https"
# scheme = "http"
## Metric version controls the mapping from Consul metrics into
## Telegraf metrics. Version 2 moved all fields with string values
## to tags.
##
## example: metric_version = 1; deprecated in 1.16
## metric_version = 2; recommended version
# metric_version = 1
## ACL token used in every request
# token = ""
@ -41,7 +49,7 @@ report those stats already using StatsD protocol if needed.
```
### Metrics:
##### metric_version = 1:
- consul_health_checks
- tags:
- node (node that check/service is registered on)
@ -55,9 +63,23 @@ report those stats already using StatsD protocol if needed.
- critical (integer)
- warning (integer)
##### metric_version = 2:
- consul_health_checks
- tags:
- node (node that check/service is registered on)
- service_name
- check_id
- check_name
- service_id
- status
- fields:
- passing (integer)
- critical (integer)
- warning (integer)
`passing`, `critical`, and `warning` are integer representations of the health
check state. A value of `1` represents that the status was the state of the
the health check at this sample.
the health check at this sample. `status` is string representation of the same state.
## Example output

View File

@ -1,6 +1,6 @@
# Exec Input Plugin
The `exec` plugin executes the `commands` on every interval and parses metrics from
The `exec` plugin executes all the `commands` in parallel on every interval and parses metrics from
their output in any one of the accepted [Input Data Formats](https://github.com/influxdata/telegraf/blob/master/docs/DATA_FORMATS_INPUT.md).
This plugin can be used to poll for custom metrics from any source.

View File

@ -7,9 +7,7 @@ This input plugin checks HTTP/HTTPS connections.
```toml
# HTTP/HTTPS request given an address a method and a timeout
[[inputs.http_response]]
## Deprecated in 1.12, use 'urls'
## Server address (default http://localhost)
# address = "http://localhost"
## address is Deprecated in 1.12, use 'urls'
## List of urls to query.
# urls = ["http://localhost"]
@ -39,8 +37,8 @@ This input plugin checks HTTP/HTTPS connections.
# {'fake':'data'}
# '''
## Optional name of the field that will contain the body of the response.
## By default it is set to an empty String indicating that the body's content won't be added
## Optional name of the field that will contain the body of the response.
## By default it is set to an empty String indicating that the body's content won't be added
# response_body_field = ''
## Maximum allowed HTTP response body size in bytes.

View File

@ -9,12 +9,15 @@ The `/api/v2/write` endpoint supports the `precision` query parameter and can be
to one of `ns`, `us`, `ms`, `s`. All other parameters are ignored and
defer to the output plugins configuration.
Telegraf minimum version: Telegraf 1.16.0
### Configuration:
```toml
[[inputs.influxdb_v2_listener]]
## Address and port to host InfluxDB listener on
service_address = ":9999"
## (Double check the port. Could be 9999 if using OSS Beta)
service_address = ":8086"
## Maximum allowed HTTP request body size in bytes.
## 0 means to use the default of 32MiB.

View File

@ -0,0 +1,108 @@
# Intel RDT Input Plugin
The intel_rdt plugin collects information provided by monitoring features of
Intel Resource Director Technology (Intel(R) RDT) like Cache Monitoring Technology (CMT),
Memory Bandwidth Monitoring (MBM), Cache Allocation Technology (CAT) and Code
and Data Prioritization (CDP) Technology provide the hardware framework to monitor
and control the utilization of shared resources, like last level cache, memory bandwidth.
These Technologies comprise Intels Resource Director Technology (RDT).
As multithreaded and multicore platform architectures emerge,
running workloads in single-threaded, multithreaded, or complex virtual machine environment,
the last level cache and memory bandwidth are key resources to manage. Intel introduces CMT,
MBM, CAT and CDP to manage these various workloads across shared resources.
To gather Intel RDT metrics plugin uses _pqos_ cli tool which is a part of [Intel(R) RDT Software Package](https://github.com/intel/intel-cmt-cat).
Before using this plugin please be sure _pqos_ is properly installed and configured regarding that the plugin
run _pqos_ to work with `OS Interface` mode. This plugin supports _pqos_ version 4.0.0 and above.
Be aware pqos tool needs root privileges to work properly.
Metrics will be constantly reported from the following `pqos` commands within the given interval:
#### In case of cores monitoring:
```
pqos -r --iface-os --mon-file-type=csv --mon-interval=INTERVAL --mon-core=all:[CORES]\;mbt:[CORES]
```
where `CORES` is equal to group of cores provided in config. User can provide many groups.
#### In case of process monitoring:
```
pqos -r --iface-os --mon-file-type=csv --mon-interval=INTERVAL --mon-pid=all:[PIDS]\;mbt:[PIDS]
```
where `PIDS` is group of processes IDs which name are equal to provided process name in a config.
User can provide many process names which lead to create many processes groups.
In both cases `INTERVAL` is equal to sampling_interval from config.
Because PIDs association within system could change in every moment, Intel RDT plugin provides a
functionality to check on every interval if desired processes change their PIDs association.
If some change is reported, plugin will restart _pqos_ tool with new arguments. If provided by user
process name is not equal to any of available processes, will be omitted and plugin will constantly
check for process availability.
### Useful links
Pqos installation process: https://github.com/intel/intel-cmt-cat/blob/master/INSTALL
Enabling OS interface: https://github.com/intel/intel-cmt-cat/wiki, https://github.com/intel/intel-cmt-cat/wiki/resctrl
More about Intel RDT: https://www.intel.com/content/www/us/en/architecture-and-technology/resource-director-technology.html
### Configuration
```toml
# Read Intel RDT metrics
[[inputs.IntelRDT]]
## Optionally set sampling interval to Nx100ms.
## This value is propagated to pqos tool. Interval format is defined by pqos itself.
## If not provided or provided 0, will be set to 10 = 10x100ms = 1s.
# sampling_interval = "10"
## Optionally specify the path to pqos executable.
## If not provided, auto discovery will be performed.
# pqos_path = "/usr/local/bin/pqos"
## Optionally specify if IPC and LLC_Misses metrics shouldn't be propagated.
## If not provided, default value is false.
# shortened_metrics = false
## Specify the list of groups of CPU core(s) to be provided as pqos input.
## Mandatory if processes aren't set and forbidden if processes are specified.
## e.g. ["0-3", "4,5,6"] or ["1-3,4"]
# cores = ["0-3"]
## Specify the list of processes for which Metrics will be collected.
## Mandatory if cores aren't set and forbidden if cores are specified.
## e.g. ["qemu", "pmd"]
# processes = ["process"]
```
### Exposed metrics
| Name | Full name | Description |
|---------------|-----------------------------------------------|-------------|
| MBL | Memory Bandwidth on Local NUMA Node | Memory bandwidth utilization by the relevant CPU core/process on the local NUMA memory channel |
| MBR | Memory Bandwidth on Remote NUMA Node | Memory bandwidth utilization by the relevant CPU core/process on the remote NUMA memory channel |
| MBT | Total Memory Bandwidth | Total memory bandwidth utilized by a CPU core/process on local and remote NUMA memory channels |
| LLC | L3 Cache Occupancy | Total Last Level Cache occupancy by a CPU core/process |
| *LLC_Misses | L3 Cache Misses | Total Last Level Cache misses by a CPU core/process |
| *IPC | Instructions Per Cycle | Total instructions per cycle executed by a CPU core/process |
*optional
### Troubleshooting
Pointing to non-existing core will lead to throwing an error by _pqos_ and plugin will not work properly.
Be sure to check if provided core number exists within desired system.
Be aware reading Intel RDT metrics by _pqos_ cannot be done simultaneously on the same resource.
So be sure to not use any other _pqos_ instance which is monitoring the same cores or PIDs within working system.
Also there is no possibility to monitor same cores or PIDs on different groups.
Pids association for the given process could be manually checked by `pidof` command. E.g:
```
pidof PROCESS
```
where `PROCESS` is process name.
### Example Output
```
> rdt_metric,cores=12\,19,host=r2-compute-20,name=IPC,process=top value=0 1598962030000000000
> rdt_metric,cores=12\,19,host=r2-compute-20,name=LLC_Misses,process=top value=0 1598962030000000000
> rdt_metric,cores=12\,19,host=r2-compute-20,name=LLC,process=top value=0 1598962030000000000
> rdt_metric,cores=12\,19,host=r2-compute-20,name=MBL,process=top value=0 1598962030000000000
> rdt_metric,cores=12\,19,host=r2-compute-20,name=MBR,process=top value=0 1598962030000000000
> rdt_metric,cores=12\,19,host=r2-compute-20,name=MBT,process=top value=0 1598962030000000000
```

View File

@ -2,6 +2,8 @@
The proxmox plugin gathers metrics about containers and VMs using the Proxmox API.
Telegraf minimum version: Telegraf 1.16.0
### Configuration:
```toml

View File

@ -0,0 +1,58 @@
# RAS Input Plugin
The `RAS` plugin gathers and counts errors provided by [RASDaemon](https://github.com/mchehab/rasdaemon).
### Configuration
```toml
[[inputs.ras]]
## Optional path to RASDaemon sqlite3 database.
## Default: /var/lib/rasdaemon/ras-mc_event.db
# db_path = ""
```
In addition `RASDaemon` runs, by default, with `--enable-sqlite3` flag. In case of problems with SQLite3 database please verify this is still a default option.
### Metrics
- ras
- tags:
- socket_id
- fields:
- memory_read_corrected_errors
- memory_read_uncorrectable_errors
- memory_write_corrected_errors
- memory_write_uncorrectable_errors
- cache_l0_l1_errors
- tlb_instruction_errors
- cache_l2_errors
- upi_errors
- processor_base_errors
- processor_bus_errors
- internal_timer_errors
- smm_handler_code_access_violation_errors
- internal_parity_errors
- frc_errors
- external_mce_errors
- microcode_rom_parity_errors
- unclassified_mce_errors
Please note that `processor_base_errors` is aggregate counter measuring the following MCE events:
- internal_timer_errors
- smm_handler_code_access_violation_errors
- internal_parity_errors
- frc_errors
- external_mce_errors
- microcode_rom_parity_errors
- unclassified_mce_errors
### Permissions
This plugin requires access to SQLite3 database from `RASDaemon`. Please make sure that user has required permissions to this database.
### Example Output
```
ras,host=ubuntu,socket_id=0 external_mce_base_errors=1i,frc_errors=1i,instruction_tlb_errors=5i,internal_parity_errors=1i,internal_timer_errors=1i,l0_and_l1_cache_errors=7i,memory_read_corrected_errors=25i,memory_read_uncorrectable_errors=0i,memory_write_corrected_errors=5i,memory_write_uncorrectable_errors=0i,microcode_rom_parity_errors=1i,processor_base_errors=7i,processor_bus_errors=1i,smm_handler_code_access_violation_errors=1i,unclassified_mce_base_errors=1i 1598867393000000000
ras,host=ubuntu level_2_cache_errors=0i,upi_errors=0i 1598867393000000000
```

View File

@ -14,6 +14,11 @@
## If no servers are specified, then localhost is used as the host.
## If no port is specified, 6379 is used
servers = ["tcp://localhost:6379"]
## Optional. Specify redis commands to retrieve values
# [[inputs.redis.commands]]
# command = ["get", "sample-key"]
# field = "sample-key-value"
# type = "string"
## specify server password
# password = "s#cr@t%"

View File

@ -7,13 +7,13 @@ SMART information is separated between different measurements: `smart_device` is
If no devices are specified, the plugin will scan for SMART devices via the following command:
```bash
```
smartctl --scan
```
Metrics will be reported from the following `smartctl` command:
```bash
```
smartctl --info --attributes --health -n <nocheck> --format=brief <device>
```
@ -23,7 +23,7 @@ Also, NVMe capabilities were introduced in version 6.5.
To enable SMART on a storage device run:
```bash
```
smartctl -s on <device>
```
## NVMe vendor specific attributes
@ -35,29 +35,29 @@ In case of `nvme-cli` absence NVMe vendor specific metrics will not be obtained.
Vendor specific SMART metrics for NVMe disks may be reported from the following `nvme` command:
```bash
```
nvme <vendor> smart-log-add <device>
```
Note that vendor plugins for `nvme-cli` could require different naming convention and report format.
To see installed plugin extensions, depended on the nvme-cli version, look at the bottom of:
```bash
```
nvme help
```
To gather disk vendor id (vid) `id-ctrl` could be used:
```bash
```
nvme id-ctrl <device>
```
Association between a vid and company can be found there: https://pcisig.com/membership/member-companies.
Devices affiliation to being NVMe or non NVMe will be determined thanks to:
```bash
```
smartctl --scan
```
and:
```bash
```
smartctl --scan -d nvme
```
@ -203,16 +203,16 @@ If this plugin is not working as expected for your SMART enabled device,
please run these commands and include the output in a bug report:
For non NVMe devices (from smartctl version >= 7.0 this will also return NVMe devices by default):
```bash
```
smartctl --scan
```
For NVMe devices:
```bash
```
smartctl --scan -d nvme
```
Run the following command replacing your configuration setting for NOCHECK and
the DEVICE (name of the device could be taken from the previous command):
```bash
```
smartctl --info --health --attributes --tolerance=verypermissive --nocheck NOCHECK --format=brief -d DEVICE
```
If you try to gather vendor specific metrics, please provide this commad

View File

@ -35,6 +35,9 @@ information.
## SNMP community string.
# community = "public"
## Agent host tag
# agent_host_tag = "agent_host"
## Number of retries to attempt.
# retries = 3

View File

@ -78,7 +78,7 @@ GO
## - AzureSQLDBResourceGovernance
## - AzureSQLDBDatabaseIO
## - AzureSQLDBServerProperties
## - AzureSQLDBSQLOsWaitstats
## - AzureSQLDBOsWaitstats
## - AzureSQLDBMemoryClerks
## - AzureSQLDBPerformanceCounters
## - AzureSQLDBRequests
@ -92,7 +92,7 @@ GO
## - AzureSQLMIOsWaitstats
## - AzureSQLMIMemoryClerks
## - AzureSQLMIPerformanceCounters
## - AzureSQLMIDBRequests
## - AzureSQLMIRequests
## - AzureSQLMISchedulers
## database_type = SQLServer by default collects the following queries

View File

@ -6,6 +6,8 @@ Supports Windows Vista and higher.
Telegraf should have Administrator permissions to subscribe for some of the Windows Events Channels, like System Log.
Telegraf minimum version: Telegraf 1.16.0
### Configuration
```toml

View File

@ -66,6 +66,7 @@ import icinga2Markdown from 'src/writeData/components/telegrafPlugins/icinga2.md
import infinibandMarkdown from 'src/writeData/components/telegrafPlugins/infiniband.md'
import influxdb_listenerMarkdown from 'src/writeData/components/telegrafPlugins/influxdb_listener.md'
import influxdb_v2_listenerMarkdown from 'src/writeData/components/telegrafPlugins/influxdb_v2_listener.md'
import intel_rdtMarkdown from 'src/writeData/components/telegrafPlugins/intel_rdt.md'
import influxdbMarkdown from 'src/writeData/components/telegrafPlugins/influxdb.md'
import internalMarkdown from 'src/writeData/components/telegrafPlugins/internal.md'
import interruptsMarkdown from 'src/writeData/components/telegrafPlugins/interrupts.md'
@ -143,6 +144,7 @@ import proxmoxMarkdown from 'src/writeData/components/telegrafPlugins/proxmox.md
import puppetagentMarkdown from 'src/writeData/components/telegrafPlugins/puppetagent.md'
import rabbitmqMarkdown from 'src/writeData/components/telegrafPlugins/rabbitmq.md'
import raindropsMarkdown from 'src/writeData/components/telegrafPlugins/raindrops.md'
import rasMarkdown from 'src/writeData/components/telegrafPlugins/ras.md'
import redfishMarkdown from 'src/writeData/components/telegrafPlugins/redfish.md'
import redisMarkdown from 'src/writeData/components/telegrafPlugins/redis.md'
import rethinkdbMarkdown from 'src/writeData/components/telegrafPlugins/rethinkdb.md'
@ -250,6 +252,7 @@ import icinga2Logo from 'src/writeData/graphics/icinga2.svg'
import infinibandLogo from 'src/writeData/graphics/infiniband.svg'
import influxdb_listenerLogo from 'src/writeData/graphics/influxdb_listener.svg'
import influxdb_v2_listenerLogo from 'src/writeData/graphics/influxdb_v2_listener.svg'
import intel_rdtLogo from 'src/writeData/graphics/intel_rdt.svg'
import influxdbLogo from 'src/writeData/graphics/influxdb.svg'
import internalLogo from 'src/writeData/graphics/internal.svg'
import interruptsLogo from 'src/writeData/graphics/interrupts.svg'
@ -327,6 +330,7 @@ import proxmoxLogo from 'src/writeData/graphics/proxmox.svg'
import puppetagentLogo from 'src/writeData/graphics/puppetagent.svg'
import rabbitmqLogo from 'src/writeData/graphics/rabbitmq.svg'
import raindropsLogo from 'src/writeData/graphics/raindrops.svg'
import rasLogo from 'src/writeData/graphics/ras.svg'
import redfishLogo from 'src/writeData/graphics/redfish.svg'
import redisLogo from 'src/writeData/graphics/redis.svg'
import rethinkdbLogo from 'src/writeData/graphics/rethinkdb.svg'
@ -807,6 +811,13 @@ export const WRITE_DATA_TELEGRAF_PLUGINS: WriteDataItem[] = [
markdown: influxdb_v2_listenerMarkdown,
image: influxdb_v2_listenerLogo,
},
{
id: 'intel_rdt',
name: 'Intel RDT',
url: `${TELEGRAF_PLUGINS}/intel_rdt`,
markdown: intel_rdtMarkdown,
image: intel_rdtLogo,
},
{
id: 'internal',
name: 'Telegraf Internal',
@ -1339,6 +1350,13 @@ export const WRITE_DATA_TELEGRAF_PLUGINS: WriteDataItem[] = [
markdown: raindropsMarkdown,
image: raindropsLogo,
},
{
id: 'ras',
name: 'RAS Daemon',
url: `${TELEGRAF_PLUGINS}/ras`,
markdown: rasMarkdown,
image: rasLogo,
},
{
id: 'redfish',
name: 'Redfish',

View File

@ -0,0 +1,31 @@
<?xml version="1.0" encoding="utf-8"?>
<!-- Generator: Adobe Illustrator 24.1.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
<svg version="1.1" id="Layer_2" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
viewBox="0 0 395.4 155.9" style="enable-background:new 0 0 395.4 155.9;" xml:space="preserve">
<style type="text/css">
.st0{fill:#00C7FD;}
.st1{fill:#FFFFFF;}
</style>
<rect x="4.7" y="5.2" class="st0" width="28.1" height="28.1"/>
<path class="st1" d="M32.1,151.6V50.3H5.4v101.2H32.1z M208.9,152.6v-24.8c-3.9,0-7.2-0.2-9.6-0.6c-2.8-0.4-4.9-1.4-6.3-2.8
c-1.4-1.4-2.3-3.4-2.8-6.1c-0.4-2.5-0.6-5.8-0.6-9.8V73.2h19.3V50.3h-19.3V10.9h-26.7v97.9c0,8.3,0.7,15.3,2.1,20.9
c1.4,5.5,3.8,10,7.1,13.4c3.3,3.4,7.7,5.8,13,7.3c5.4,1.5,12.2,2.2,20.3,2.2H208.9z M361.7,151.6V3.1h-26.7v148.5H361.7z
M137.2,60.3c-7.4-8-17.8-12-31-12c-6.4,0-12.3,1.3-17.5,3.9C83.4,54.8,79,58.4,75.4,63L74,64.9l0-1.7V50.3H47.7v101.2h26.5V97.6
l0,3.7c0-0.6,0-1.2,0-1.8c0.3-9.5,2.6-16.5,7-21c4.7-4.8,10.4-7.2,16.9-7.2c7.7,0,13.6,2.4,17.5,7c3.8,4.6,5.8,11.1,5.8,19.4l0,0V98
c0,0,0,0,0,0l0,0l0,53.5h26.9V94.1C148.4,79.7,144.6,68.3,137.2,60.3z M321.2,100.8c0-7.3-1.3-14.1-3.8-20.5
c-2.6-6.3-6.2-11.9-10.7-16.7c-4.6-4.8-10.1-8.5-16.5-11.2c-6.4-2.7-13.5-4-21.2-4c-7.3,0-14.2,1.4-20.6,4.1
c-6.4,2.8-12,6.5-16.7,11.2c-4.7,4.7-8.5,10.3-11.2,16.7c-2.8,6.4-4.1,13.3-4.1,20.6c0,7.3,1.3,14.2,3.9,20.6
c2.6,6.4,6.3,12,10.9,16.7c4.6,4.7,10.3,8.5,16.9,11.2c6.6,2.8,13.9,4.2,21.7,4.2c22.6,0,36.6-10.3,45-19.9l-19.2-14.6
c-4,4.8-13.6,11.3-25.6,11.3c-7.5,0-13.7-1.7-18.4-5.2c-4.7-3.4-7.9-8.2-9.6-14.1l-0.3-0.9h79.5V100.8z M241.9,91.5
c0-7.4,8.5-20.3,26.8-20.4c18.3,0,26.9,12.9,26.9,20.3L241.9,91.5z M392.1,138.8c-0.5-1.2-1.2-2.2-2.1-3.1c-0.9-0.9-1.9-1.6-3.1-2.1
c-1.2-0.5-2.5-0.8-3.8-0.8c-1.4,0-2.6,0.3-3.8,0.8c-1.2,0.5-2.2,1.2-3.1,2.1c-0.9,0.9-1.6,1.9-2.1,3.1c-0.5,1.2-0.8,2.5-0.8,3.8
c0,1.4,0.3,2.6,0.8,3.8s1.2,2.2,2.1,3.1c0.9,0.9,1.9,1.6,3.1,2.1c1.2,0.5,2.5,0.8,3.8,0.8c1.4,0,2.6-0.3,3.8-0.8
c1.2-0.5,2.2-1.2,3.1-2.1c0.9-0.9,1.6-1.9,2.1-3.1c0.5-1.2,0.8-2.5,0.8-3.8C392.9,141.3,392.6,140,392.1,138.8z M390.5,145.8
c-0.4,1-1,1.9-1.7,2.6c-0.7,0.7-1.6,1.3-2.6,1.7c-1,0.4-2,0.6-3.2,0.6c-1.1,0-2.2-0.2-3.2-0.6c-1-0.4-1.9-1-2.6-1.7
c-0.7-0.7-1.3-1.6-1.7-2.6c-0.4-1-0.6-2-0.6-3.2c0-1.1,0.2-2.2,0.6-3.2c0.4-1,1-1.9,1.7-2.6c0.7-0.7,1.6-1.3,2.6-1.7
c1-0.4,2-0.6,3.2-0.6c1.1,0,2.2,0.2,3.2,0.6c1,0.4,1.9,1,2.6,1.7c0.7,0.7,1.3,1.6,1.7,2.6c0.4,1,0.6,2,0.6,3.2
C391.1,143.8,390.9,144.8,390.5,145.8z M384.9,143.5c0.8-0.1,1.4-0.4,1.9-0.9c0.5-0.5,0.8-1.2,0.8-2.2c0-1.1-0.3-1.9-1-2.5
c-0.6-0.6-1.7-0.9-3-0.9h-4.4v11.3h2.1v-4.6h1.5l2.8,4.6h2.2L384.9,143.5z M383.8,141.8c-0.3,0-0.6,0-1,0h-1.5v-3.2h1.5
c0.3,0,0.6,0,1,0c0.3,0,0.6,0.1,0.9,0.2c0.3,0.1,0.5,0.3,0.6,0.5c0.2,0.2,0.2,0.5,0.2,0.9c0,0.4-0.1,0.7-0.2,0.9
c-0.2,0.2-0.4,0.4-0.6,0.5C384.4,141.7,384.1,141.8,383.8,141.8z"/>
</svg>

After

Width:  |  Height:  |  Size: 2.9 KiB

File diff suppressed because it is too large Load Diff

After

Width:  |  Height:  |  Size: 106 KiB