13 Aralık 2018 Perşembe

Envoyproxybeat: Elastic Beats for Envoy Proxy

What is the Envoyproxybeat


Envoyproxybeat is an Elastic Beat that reads stats from the Envoy Proxy and indexes them into Elasticsearch or Logstash.

Configuration Options

You need to adjust the envoyproxybeat.yml configuration file to your needs. Here is a sample configuration:

input:
  # Defines how often an event is sent to the output
  period: 30

  # Defines the http port serviced
  # Default to :9901
  port: :9901

  # Defines the http host serviced
  # Default to localhost
  host: localhost

Options

period
How often events are sent to the Elasticsearch.
period: 30

port and host
envoyproxybeat collect data from the Envoy Proxy the predefined to localhost: 5984. You should be careful when you change these settings.

port: :9901
host: localhost

Run Envoyproxybeat

First, setup Golang environment (if you don't have it already)

cd $GOPATH
mkdir -p src/github.com/berfinsari
cd src/github.com/berfinsari
git clone https://github.com/berfinsari/envoyproxybeat.git
cd envoyproxybeat
make

To run Envoyproxybeat with debugging output enabled, run:

./envoyproxybeat -c envoyproxybeat.yml -e -d "*"


Envoy Proxy Statistics

Envoy outputs numerous statistics which depend on how the server is configured. They can be seen locally via the /stats admin endpoint. The admin endpoint looks directly into the store to load all of the counters and gauges and print them.

Envoyproxybeat reads data from Envoy admin endpoint. For now, Envoyproxybeat collects non-dynamic statistics.

Document Example

  "envoyproxy": {
    "server": {
      "cluster_manager": {
        "warming_clusters": 0,
        "active_clusters": 1,
        "cluster_added": 1,
        "cluster_modified": 0,
        "cluster_removed": 0
      },
      "filesystem": {
        "write_buffered": 1,
        "write_completed": 1,
        "write_total_buffered": 0,
        "flushed_by_timer": 0,
        "reopen_failed": 0
      },
      "runtime": {
        "override_dir_exists": 0,
        "override_dir_not_exists": 0,
        "admin_overrides_active": 0,
        "load_error": 0,
        "load_success": 0,
        "num_keys": 0
      },
      "listener_manager": {
        "listener_added": 1,
        "listener_create_failure": 0,
        "listener_create_success": 4,
        "listener_modified": 0,
        "listener_removed": 0,
        "total_listeners_active": 1,
        "total_listeners_draining": 0,
        "total_listeners_warming": 0
      },
      "stats": {
        "overflow": 0
      },
      "server": {
        "live": 1,
        "memory_heap_size": 4194304,
        "watchdog_mega_miss": 0,
        "version": 4151803,
        "uptime": 15,
        "memory_allocated": 3168904,
        "parent_connections": 0,
        "days_until_first_cert_expiring": 2147483647,
        "watchdog_miss": 0,
        "total_connections": 0,
        "hot_restart_epoch": 0
      },
      "http2": {}
}


21 Ağustos 2018 Salı

Go ile Komut Satırı Aracı Oluşturmak

CLI(Command Line Interface) -türkçe olarak ifade edersek komut satırı arayüzü- kullanıcıların komut satırında etkileşimde bulunduğu programdır.
Go standart kütüphanelerini kullanarak komut satırı araçları oluşturmanın basit bir yolunu sunuyor. Go'da bunu yapmanın birden çok yolu vardır ancak bu yazıda genel hatlarıyla flag paketini açıklayacağım.

Parametreleri Ayrıştırma

Ayrıştırma işleminde genel olarak kullanılan üç terim vardır; argümanlar, seçenekler ve bayraklar. Bunlar sıklıkla birbirinin yerine kullanılır.
Go bu terimler konusunda genel tanımlara uymuyor, flag paketi ile bir veya iki tire ile başlayan tüm dizgeleri bayrak olarak, kullanıcı girdisi ve tire olmayan tüm dizgeleri argüman olarak kabul ediyor. 

Flag Paketi

Flag paketi, komut satırı ayrıştırma işlemleri için kullanılan standart kütüphanedir.

Bayrakları, flag.String(), flag.Bool(), flag.Int() kullanılarak tanımlayabiliriz:

import "flag"
var ipPtr = flag.Int("bayrakAdı", 1234, "bayrakAdı için yardım mesajı")
flag.Parse()

ipPtr -bayrakAdı veya --bayrakAdı parametresi ile alınan değere referans gösterecektir. *ipPtr varsayılan değeri 1234'tür.
Bu örnekte flag.Parse() işlevi, komut satırı girişini ayrıştırır ve -bayrakAdı parametresi ile aldığı değeri *ipPtr'a yazar.

Bayrak olarak tanımlananlar birer işaretçilerdir.
Bayrağı Var() işlevi kullanarak bir değişkene bağlayabiliriz:

var ipdegeri int
flag.IntVar(&ipdegeri, "bayrakAdı", 1234, "bayrakAdı için yardım mesajı")
flag.Parse()

Kullanıcıdan aldığı cümlenin kaç kelimeden olduğunu döndüren basit bir go programı üzerinden flag paketini nasıl kullanacağımızı inceleyelim:

package main

import (
    "flag"
    "fmt"
    "os"
    "strings"
)

func main() {
    var cumle string
    flag.StringVar(&cumle, "boyut", "", "Cümlenin boyutunu döndürür.")
    flag.Parse()

    if cumle == "" {
        flag.PrintDefaults()
        os.Exit(1)
    }
    cumleBoyutu := kacKelime(cumle)
    fmt.Printf("Cumlenin kelime sayisi = %d \n", cumleBoyutu)

}

func kacKelime(cumle string) int {
    var kelimeler []string
    kelimeler = strings.Split(cumle, " ")
    return len(kelimeler)
}

Burada varsayılan değeri boş karakter dizgesi olan string türünde bir bayrak tanımlıyoruz. Eğer StringVar kullanıyorsak, değerin yazılacağı değişkenin adresini belirtmeliyiz. Son kısımda da kullanıcılara bu bayrağın ne işe yaradığını anlatmak için kullanım iletisi ekliyoruz.
Eğer kullanıcı herhangi bir parametre girmezse tanımlanan tüm komut satırı parametrelerinin kullanım iletisini yazdırır.
Eğer kullanıcı -boyut parametresi ile bir cümle yazarsa program girilen cümlenin kaç kelime olduğunu dönecektir.
Not: Programda string paketi cümleyi kelimelere bölmek, os paketi ise programın sonlanması için kullanılmıştır.
Son olarak bütün bayraklar tanımlandıktan sonra bayrakların değerlerinin atanması için flag.Parse() öğesini çağırmalıyız.

Help Çıktısı

Komut satırı aracınıza kullanıcıları nasıl çalıştıracağı konusunda yönlendiren bir mesaj eklemelisiniz. flag paketi bayrak oluştururken eklediğimiz kullanım iletilerini birleştirerek yardım metnini oluşturur.
Yardım metnini görüntülemek için:
./komutSatırıBayraklari --help
veya
./komutSatırıBayraklari -h
komutlarını kullanabiliriz.

help çıktısını kendimizde değiştirebiliriz, bunun için flag paketinde Usage işlevi bulunmaktadır.

package main

import (
    "flag"
    "fmt"
    "os"
)

func main() {
    flag.Usage = func() {
        fmt.Printf("%s programının yardım sayfasıdır.", os.Args[0])
        PrintDefaults()
    }
    flag.Parse()
}

Artık programımızı -h veya --help parametresiyle çalıştırdığımızda Usage ile oluşturduğumuz mesaj yazılacaktır.
Burada program adı yerine os.Args[0] kullanılmıştır çünkü ilk argüman her zaman programın adıdır.

Bir bayrağı zorunlu hale getirmek için:

    cumlePtr := flag.String("b", "", "Cümlenin boyutunu döndürür.(Kullanımı zorunludur.)")
    kontrolPtr := flag.Bool("k", false, "Doğru ya da yanlış değerini alır. Varsayılan değeri false.")
    flag.Parse()
    if *cumlePtr == "" {
        flag.PrintDefaults()
        os.Exit(1)
    }
    fmt.Printf("cumlePtr: %s,  kontrolPtr: %t", *cumlePtr, *kontrolPtr)

Burada -b parametresi olmadan program çalışmayacaktır.

Komut Satırından Çalıştırılabilir Hale Getirmek
$ go build gobayrak.go
Bu komut ile gobayrak adında çalıştırılabilir dosya oluşur.

$ cp gobayrak /usr/local/bin
Bu dosyayı /usr/local/bin dizinine kopyalarak programımızı komut satırından kullanabiliriz.

8 Ağustos 2018 Çarşamba

/etc/hosts Dosyası ve NSS Nedir?

Hosts Dosyası Nedir?


    Hosts dosyası makine adlarını IP adreslerine eşleyen, metin editörü ile açılıp düzenlenebilen bir işletim sistemi dosyasıdır. İnternet sitelerinin isimlerini IP adresleri ile eşleştirir de diyebiliriz.
Makine adları için statik bir tablo araması yapar.
  • Makine adlarını çözümleme işlevinde, yerel sistemlerde kullanılmak üzere hosts dosyası herhangi bir makine adını veya alan adını tanımlamak için kullanılabilir.
  • Bazı web servisleri, geliştiriciler veya yöneticiler şirketin iç kaynaklarına erişmek, bunları test etmek gibi çeşitli amaçlar için alanı sadece yerel alan ağı içinde tanımlar.
    Örneğin; sadece bir şirket içinde -şirketin yerel alan ağında- kullanılan bir panelimiz olsun. Bunu hosts dosyasında tanımlayarak bağlanabiliriz.
  • Hosts dosyası çevrimiçi reklamcılığı, casus yazılımı, reklam yazılımı veya diğer kötü amaçlı yazılımları içerdiği bilinen zararlı kaynakların ve sunucuların etki alanlarını engellemek için kullanılabilir.
  • DNS hizmetinde bir sorun, engel yada yönlendirme varsa hosts dosyasında belirli alan adlarını IP adresleriyle birlikte değiştirerek açık hale getirebiliriz.

Makine Adı ve IP Adreslerini Eşleme

    Hosts dosyası içerisinde her makine için tek satır ayrılmıştır ve bu satırların yazımı aşağıdaki formattadır:

IP_address    canonical_hostname    [aliases ...]

Dosya içerisinde;
  • her alan bir boşluk karakteriyle veya tab karakteri ile birbirinden ayrılır.
  • IP_address diye belirtilen alan, o makine adı için kullanılacak olan IP adresidir. 
  • canonical_hostname ile belirtilen alan, IP adresiyle ilişkili yerel olarak bilinen sunucu adlarını belirtir. Genel yapıya göre IP adresinden sonraki ilk alan tam nitelikli alan adıdır. Yabi bu makinenin/sunucunun resmi adıdır. 
  • aliases diye belirtilen diğer alanlar, tanımlanan IP adresi için diğer adlar veya alternatif adlardır.
  • tamamen boş satırlar yok sayılır.

 /etc/hosts düz metin dosyasıdır ve iki türde satırlara izin verilir:
  • Makine/sunucu adı tanımlaması
  • Boş satırlar veya yorum satırları
Yorum sayırları '#' ile başlamalıdır.,


Hosts Dosyasının Konumu

    Dosya sistemi hiyerarşisi işletim sistemine göre değişir. Ancak bu dosya genellikle 'hosts' olarak isimlendirir.
Unix ve Unix-benzeri sistemlerde /etc/hosts konumunda bulunur. 

Örnek hosts dosyası:

       # The following lines are desirable for IPv4 capable hosts
       127.0.0.1       localhost

       # 127.0.1.1 is often used for the FQDN of the machine
       127.0.1.1       thishost.mydomain.org  thishost
       192.168.1.10    foo.mydomain.org       foo
       192.168.1.13    bar.mydomain.org       bar
       146.82.138.7    master.debian.org      master
       209.237.226.90  www.opensource.org

       # The following lines are desirable for IPv6 capable hosts
       ::1             localhost ip6-localhost ip6-loopback
       ff02::1         ip6-allnodes
       ff02::2         ip6-allrouters



    Bazı işletim sistemlerinde hosts dosyasının içeriği, DNS gibi diğer ad çözümleme yöntemleri için kullanılır ancak birçok sistem özelleştirme sağlamak için -Linux ve Unix için nsswitch.conf gibi-  
NSS (name server switch) kullanır. Uzak DNS çözümleyicisinin aksine, hosts dosyası yerel bilgisayar yöneticisinin doğrudan denetimi altındadır.

Peki Nedir Bu NSS?

    NSS ortak yapılandırma veritabanları ve ad çözümleme mekanizmaları için çeşitli kaynaklar sağlayan Unix-benzeri işletim sistemlerinde kullanılan bir servistir. Bu kaynaklar yerel işletim sistemi dosyalarını (/etc/group, /etc/passwd, /etc/hosts gibi), DNS, NIS ve LDAP'ı içerir.
NSS bir istemcinin veya uygulamanın ağ bilgilerini nasıl aldığını kontrol eder. 
nsswitch.conf dosyası ile yapılandırılabilir.

/etc/nsswitch.conf Dosyası

    Bu dosya GNU C kütüphanesi tarafından, çeşitli kategorilerde name-service hizmeti bilgileri elde etmek için hangi kaynaklardan ve hangi sırayla alınacağını belirlemek için kullanılan düz metin dosyasıdır. Bu yapılandırma dosyası, bir işlem -hosts, users, groups gibi- hakkında bilgi içeren çeşitli veritabanlarını nasıl incelediğini kontrol eder. Her bilgi kategorisi bir veritabanı adıyla tanımlanır. 
İlk sütun veritabanı adını belirtir. Kalan sütunlar, sorgulanacak kaynakların sırasını ve arama sonucuyla gerçekleşebilecek sınırlı bir eylemler kümesini tanımlar.
Sisteminizde desteklenen servis özellikleri, paylaşılan kütüphanelerin varlığına bağlıdır ve bu yüzden genişletilebilir. Örneğin hosts veritabanı için ek olarak 'dns', passwd ve shadow veritabanları için ek olarak 'compat' seçeneği belirtebilirsiniz.

    nsswitch.conf dosyasındaki her girdi, bir veritabanı adı ve ayrılmış kaynak listesinden oluşur. Her kaynak, bir sonraki listelenen kaynağın kullanılıp kullanılmayacağını belirleyen isteğe bağlı bir sonlandırma ölçütüne sahip olabilir veya arama mevcut kaynakta sona erer.

Örnek nsswitch.conf dosyası:

           passwd:         compat
           group:           compat
           shadow:        compat

           hosts:            dns [!UNAVAIL=return] files
           networks:      nis [NOTFOUND=return] files
           ethers:           nis [NOTFOUND=return] files
           protocols:     nis [NOTFOUND=return] files
           rpc:               nis [NOTFOUND=return] files
           services:       nis [NOTFOUND=return] files

27 Temmuz 2018 Cuma

New Metricbeat Module: Envoyproxy Module

Envoyproxy Module is a Metricbeat Module that collects metrics from Envoy Proxy and indexes them into Elasticsearch or Logstash.

Envoyproxy module is written in Golang like all Metricbeat Modules and Beats.

You can check out this blog post for more information about how to create a Metricbeat Module.

What is the Envoy Proxy?


Envoy is an L7 proxy and communication bus designed for large modern service-oriented architectures.

Envoy Stats

Envoy outputs numerous statistics which depend on how the server is configured. They can be seen locally via the /stats admin endpoint. The admin endpoint looks directly into the store to load all of the counters and gauges and print them.

Envoyproxy module reads data from Envoy admin endpoint. For now, Envoyproxy module collects non-dynamic statistics.

I have blogged in the past about "Envoy Proxy Statistics" and "Envoy Proxy Installation to Ubuntu 17.10".

Getting Started with Envoyproxy Module


Initially, you need to make Envoyproxy module enabled:
./metricbeat modules enable envoyproxy
You can see a list of enabled and disabled modules by running following command:
./metricbeat modules list
Then when you run Metricbeat, it loads the corresponding module configurations specified in the modules.d directory.
For more information, you can check [1].

Now Envoyproxy module is enabled and ready to collects metrics.

Configuration


Envoyproxy Module has some settings. If you want to change some config options adjust the modules.d/envoyproxy.yml file to your needs.

Here is a sample configuration:
- module: envoyproxy
  metricsets: ["server"]
  period: 10s
  hosts: ["localhost:9901"]

module: The name of the module to run.
metricsets: A list of metricsets to execute.(For now, envoyproxy module have one metricset)
period: How often the metricsets are executed. If a system is not reachable, Metricbeat returns an error for each period.
hosts: A list of hosts of fetch information from.


Metricsets

Envoyproxy module has one metricset; server.

Server Metricset


Server statistics describe how the Envoy server instance is working. Statistics like server uptime or amount of allocated memory are categorized here.


Metrics Collected


cluster_manager
Envoy’s cluster manager manages all configured upstream clusters. Just as the Envoy configuration can contain any number of listeners, the configuration can also contain any number of independently configured upstream clusters. The cluster manager has a statistics tree rooted at cluster_manager with the following statistics.

  • active_clusters: Number of currently active (warmed) clusters. 
  • cluster_added: Total clusters added (either via static config or CDS)
  • cluster_modified: Total clusters modified (via CDS)
  • cluster_removed: Total clusters removed (via CDS)
  • warming_clusters: Number of currently warming (not active) clusters


filesystem
Statistics related to file system are emitted in the filesystem namespace.

  • flushed_by_timer: Total number of times internal flush buffers are written to a file due to flush timeout
  • reopen_failed: Total number of times a file was failed to be opened
  • write_buffered: Total number of times file data is moved to Envoys internal flush buffer.
  • write_completed: Total number of times a file was written.
  • write_total_buffered: Current total size of internal flush buffer in bytes


runtime
The runtime configuration specifies the location of the local file system tree that contains re-loadable configuration elements. The file system runtime provider emits some statistics in the runtime namespace.

  • load_error: Total number of load attempts that resulted in an error
  • load_success: Total number of load attempts that were successful
  • num_keys: Number of keys currently loaded
  • override_dir_exists: Total number of loads that did use an override directory
  • override_dir_not_exists: Total number of loads that did not use an override directory
  • admin_overrides_active


listener_manager
The top level Envoy configuration contains a list of listeners. The listener manager has a statistics tree rooted at listener_manager with the following statistics.

  • listener_added: Total listeners added (either via static config or LDS)
  • listener_create_failure: Total failed listener object additions to workers
  • listener_create_success: Total listener objects successfully added to workers
  • listener_modified: Total listeners modified (via LDS)
  • listener_removed: Total listeners removed (via LDS)
  • total_listeners_active: Number of currently active listeners
  • total_listeners_draining: Number of currently draining listeners
  • total_listeners_warming: Number of currently warming listeners


stats
A few statistics are emitted to report statistics system behavior:

  • overflow: Total number of times Envoy cannot allocate a statistic due to a shortage of shared memory


server
Server related statistics are rooted at server with following statistics:

  • days_until_first_cert_expiring: Number of days until the next certificate being managed will expire
  • live: 1 if the server is not currently draining, 0 otherwise
  • memory_allocated: Current amount of allocated memory in bytes
  • memory_heap_size: Current reserved heap size in bytes
  • parent_connections: Total connections of the old Envoy process on hot restart
  • total_connections: Total connections of both new and old Envoy processes
  • uptime: Current server uptime in seconds
  • version: Integer represented version number based on SCM revision
  • watchdog_mega_miss
  • watchdog_miss
  • hot_restart_epoch: Current hot restart epoch


http2
Each codec has the option of adding per-codec statistics. Currently only http2 has codec stats. All http2 statistics are rooted at http2.

  • header_overflow: Total number of connections reset due to the headers being larger than 63k
  • headers_cb_no_stream: Total number of errors where a header callback is called without an associated stream. This tracks an unexpected occurrence due to an as yet undiagnosed bug
  • rx_messaging_error: Total number of invalid received frames that violated section 8 of the HTTP/2 spec. This will result in a tx_reset
  • rx_reset: Total number of reset stream frames received by Envoy
  • too_many_header_frames: Total number of times an HTTP2 connection is reset due to receiving too many headers frames. Envoy currently supports proxying at most one header frame for 100-Continue one non-100 response code header frame and one frame with trailers
  • trailers: Total number of trailers seen on requests coming from downstream
  • tx_reset: Total number of reset stream frames transmitted by Envoy


Here is an example document generated by this metricset:

{
  "@timestamp": "2018-07-26T12:02:15.099Z",
  "@metadata": {
    "beat": "metricbeat",
    "type": "doc",
    "version": "7.0.0-alpha1"
  },
  "metricset": {
    "rtt": 11301,
    "name": "server",
    "module": "envoyproxy",
    "host": "localhost:9901"
  },
  "envoyproxy": {
    "server": {
      "cluster_manager": {
        "warming_clusters": 0,
        "active_clusters": 1,
        "cluster_added": 1,
        "cluster_modified": 0,
        "cluster_removed": 0
      },
      "filesystem": {
        "write_buffered": 1,
        "write_completed": 1,
        "write_total_buffered": 0,
        "flushed_by_timer": 0,
        "reopen_failed": 0
      },
      "runtime": {
        "override_dir_exists": 0,
        "override_dir_not_exists": 0,
        "admin_overrides_active": 0,
        "load_error": 0,
        "load_success": 0,
        "num_keys": 0
      },
      "listener_manager": {
        "listener_added": 1,
        "listener_create_failure": 0,
        "listener_create_success": 4,
        "listener_modified": 0,
        "listener_removed": 0,
        "total_listeners_active": 1,
        "total_listeners_draining": 0,
        "total_listeners_warming": 0
      },
      "stats": {
        "overflow": 0
      },
      "server": {
        "live": 1,
        "memory_heap_size": 4194304,
        "watchdog_mega_miss": 0,
        "version": 4151803,
        "uptime": 15,
        "memory_allocated": 3168904,
        "parent_connections": 0,
        "days_until_first_cert_expiring": 2147483647,
        "watchdog_miss": 0,
        "total_connections": 0,
        "hot_restart_epoch": 0
      },
      "http2": {}
    }
  },
  "host": {
    "name": "kripton"
  },
  "beat": {
    "name": "kripton",
    "hostname": "kripton",
    "version": "7.0.0-alpha1"
  }
}

18 Mayıs 2018 Cuma

Envoy Proxy Statistics

The first blog post introduced you to download Envoy Proxy with Docker image. In this second part, we will see how to get Envoy Proxy statistics.

Firstly, run it using docker run command:

docker run -d -p 8080:10000 -p 8081:9901 envoy:v1

Now admin console is available. This can be configured in json file inside admin property. I selected port 8081 and I had exposed that port outside Envoy Docker container.

If you invoke this command it returns all available commands: 

curl localhost:8081/

Now, running this command to get statistics: 

curl localhost:8081/stats

It returns server statistics. Look here for more information about Envoy Proxy statistics.

Example output:

cluster_manager.active_clusters: 1
cluster_manager.cluster_added: 1
cluster_manager.cluster_modified: 0
cluster_manager.cluster_removed: 0
cluster_manager.warming_clusters: 0
filesystem.flushed_by_timer: 0
filesystem.reopen_failed: 0
filesystem.write_buffered: 0
filesystem.write_completed: 0
filesystem.write_total_buffered: 0
http.admin.downstream_cx_active: 1
http.admin.downstream_cx_destroy: 0
http.admin.downstream_cx_destroy_active_rq: 0
http.admin.downstream_cx_destroy_local: 0
http.admin.downstream_cx_destroy_local_active_rq: 0
http.admin.downstream_cx_destroy_remote: 0
http.admin.downstream_cx_destroy_remote_active_rq: 0
http.admin.downstream_cx_drain_close: 0
http.admin.downstream_cx_http1_active: 1
http.admin.downstream_cx_http1_total: 1
http.admin.downstream_cx_http2_active: 0
http.admin.downstream_cx_http2_total: 0
http.admin.downstream_cx_idle_timeout: 0
http.admin.downstream_cx_protocol_error: 0
http.admin.downstream_cx_rx_bytes_buffered: 83
http.admin.downstream_cx_rx_bytes_total: 83
http.admin.downstream_cx_ssl_active: 0
http.admin.downstream_cx_ssl_total: 0
http.admin.downstream_cx_total: 1
http.admin.downstream_cx_tx_bytes_buffered: 0
http.admin.downstream_cx_tx_bytes_total: 0
http.admin.downstream_cx_websocket_active: 0
http.admin.downstream_cx_websocket_total: 0
http.admin.downstream_rq_1xx: 0
http.admin.downstream_rq_2xx: 0
http.admin.downstream_rq_3xx: 0
http.admin.downstream_rq_4xx: 0
http.admin.downstream_rq_5xx: 0
http.admin.downstream_rq_active: 1
http.admin.downstream_rq_http1_total: 1
http.admin.downstream_rq_http2_total: 0
http.admin.downstream_rq_non_relative_path: 0
http.admin.downstream_rq_response_before_rq_complete: 0
http.admin.downstream_rq_rx_reset: 0
http.admin.downstream_rq_too_large: 0
http.admin.downstream_rq_total: 1
http.admin.downstream_rq_tx_reset: 0
http.admin.downstream_rq_ws_on_non_ws_route: 0
http.admin.rs_too_large: 0
http.async-client.no_cluster: 0
http.async-client.no_route: 0
http.async-client.rq_direct_response: 0
http.async-client.rq_redirect: 0
http.async-client.rq_total: 0
http.ingress_http.downstream_cx_active: 0
http.ingress_http.downstream_cx_destroy: 0
http.ingress_http.downstream_cx_destroy_active_rq: 0
http.ingress_http.downstream_cx_destroy_local: 0
http.ingress_http.downstream_cx_destroy_remote: 0
http.ingress_http.downstream_cx_drain_close: 0
http.ingress_http.downstream_cx_http1_active: 0
http.ingress_http.downstream_cx_http1_total: 0
http.ingress_http.downstream_cx_http2_active: 0
http.ingress_http.downstream_cx_http2_total: 0
http.ingress_http.downstream_cx_idle_timeout: 0
http.ingress_http.downstream_cx_protocol_error: 0
http.ingress_http.downstream_cx_rx_bytes_buffered: 0
http.ingress_http.downstream_cx_rx_bytes_total: 0
http.ingress_http.downstream_cx_ssl_active: 0
http.ingress_http.downstream_cx_ssl_total: 0
http.ingress_http.downstream_cx_total: 0
http.ingress_http.downstream_cx_tx_bytes_buffered: 0
http.ingress_http.downstream_cx_tx_bytes_total: 0
http.ingress_http.downstream_cx_websocket_active: 0
http.ingress_http.downstream_cx_websocket_total: 0
http.ingress_http.downstream_rq_1xx: 0
http.ingress_http.downstream_rq_2xx: 0
http.ingress_http.downstream_rq_3xx: 0
http.ingress_http.downstream_rq_4xx: 0
http.ingress_http.downstream_rq_5xx: 0
http.ingress_http.downstream_rq_active: 0
http.ingress_http.downstream_rq_http1_total: 0
http.ingress_http.downstream_rq_http2_total: 0
http.ingress_http.downstream_rq_non_relative_path: 0
http.ingress_http.downstream_rq_rx_reset: 0
http.ingress_http.downstream_rq_too_large: 0
http.ingress_http.downstream_rq_total: 0
http.ingress_http.downstream_rq_tx_reset: 0
http.ingress_http.downstream_rq_ws_on_non_ws_route: 0
http.ingress_http.no_cluster: 0
http.ingress_http.no_route: 0
http.ingress_http.rq_direct_response: 0
http.ingress_http.rq_redirect: 0
http.ingress_http.rq_total: 0
http.ingress_http.rs_too_large: 0
http.ingress_http.tracing.client_enabled: 0
http.ingress_http.tracing.health_check: 0
http.ingress_http.tracing.not_traceable: 0
http.ingress_http.tracing.random_sampling: 0
http.ingress_http.tracing.service_forced: 0
listener.admin.downstream_cx_active: 1
listener.admin.downstream_cx_destroy: 0
listener.admin.downstream_cx_total: 1
listener.admin.http.admin.downstream_rq_1xx: 0
listener.admin.http.admin.downstream_rq_2xx: 0
listener.admin.http.admin.downstream_rq_3xx: 0
listener.admin.http.admin.downstream_rq_4xx: 0
listener.admin.http.admin.downstream_rq_5xx: 0
listener_manager.listener_added: 1
listener_manager.listener_create_failure: 0
listener_manager.listener_create_success: 0
listener_manager.listener_modified: 0
listener_manager.listener_removed: 0
listener_manager.total_listeners_active: 1
listener_manager.total_listeners_draining: 0
listener_manager.total_listeners_warming: 0
runtime.admin_overrides_active: 0
runtime.load_error: 0
runtime.load_success: 0
runtime.num_keys: 0
runtime.override_dir_exists: 0
runtime.override_dir_not_exists: 0
server.days_until_first_cert_expiring: 0
server.live: 1
server.memory_allocated: 0
server.memory_heap_size: 0
server.parent_connections: 0
server.total_connections: 0
server.uptime: 0server.version: 16364036
server.watchdog_mega_miss: 0
server.watchdog_miss: 0
stats.overflow: 0

17 Mayıs 2018 Perşembe

Envoy Proxy Installation to Ubuntu 17.10

Envoy is an L7 proxy and communication bus designed for large modern service oriented architectures.

The easiest way to get started with Envoy by using the Docker images.
Create a Dockerfile:

FROM envoyproxy/envoy:latest
RUN apt-get update
COPY envoy.json /etc/envoy.json
CMD /usr/local/bin/envoy -c /etc/envoy.json


Create an envoy.json configuration file that describes your own Envoy configuration. You can check here for more information. Here is an example you can use those proxies incoming request to Google.com. You have to change the listener and admin to listen to 0.0.0.0 instead of 127.0.0.1 for this to work locally.


Build the Dockerfile:

docker build -t envoy:v1 .


Run the image, binding localhost port 8080 to the listener on port 10000 and localhost port 8081 to the admin on port 9901 specified in the envoy.json:

docker run -d -p 8080:10000 -p 8081:9901 envoy:v1


Test the image with curl:

curl localhost:8080 
curl localhost:8081

This blog post based on the Envoy Proxy download page.

4 Nisan 2018 Çarşamba

Tracebeat : Elastic Beat for Traceroute Command

What is the Tracebeat

Tracebeat is an Elastic Beat that reads traceroute output and indexes them into Elasticsearch or Logstash.
Tracebeat is written in Golang like all Beats.
In computing, traceroute is a computer network diagnostic tool for displaying the route (path) and measuring transit delays of packets across an Internet Protocol (IP) network.

Configuration Options

You need to adjust the tracebeat.yml configuration file to your needs. Here is a sample configuration:

input:
  # Defines how often an event is sent to the output
  # Default to 30s
  period: 30

  # Defines the destination host.
  # Default to `8.8.8.8`
  host: 8.8.8.8

  # Default to 64
  maxhops: 64

  # Default to 3
  retries: 3

  # Default to 500ms
  timeoutms: 500

  # Packet size in byte
  # Default to 60
  packetsize: 60


Options


period
How often to take traceroute output and sent to the Elasticsearch.
period: 30
host
To trace the route to a network host pass the ip address of the server you want to connect.
host: 8.8.8.8
maxhops
Specifies the maximum number of hops traceroute will probe.
maxhops: 64
retries and timeoutms
retries: 3
timeoutms: 500
packetsize
Packet size in byte.
packetsize: 60

Run Tracebeat

First, setup Golang environment (if you don't have it already)

cd $GOPATH
mkdir -p src/github.com/berfinsari
cdsrc/github.com/berfinsari
git clonehttps://github.com/berfinsari/tracebeat.git
cd tracebeat
make

Must be run as sudo.
To run Tracebeat with debugging output enabled, run:

sudo ./tracebeat -c tracebeat.yml -e -d "*" -strict.perms=false

Document Example



    "traceroute": [
      {
        "address": "192.168.1.1",
        "elapsedTime": 4.74324,
        "hopNumber": 1,
        "hostName": "gateway",
        "n": 57,
        "success": true,
        "ttl": 1
      },
      {
        "address": "213.14.0.175",
        "elapsedTime": 14.180505,
        "hopNumber": 2,
        "hostName": "host-213-14-0-175.reverse.superonline.net.",
        "n": 57,
        "success": true,
        "ttl": 2
      },
      {
        "address": "10.36.246.137",
        "elapsedTime": 16.202385,
        "hopNumber": 3,
        "hostName": "",
        "n": 60,
        "success": true,
        "ttl": 3
      },
      {
        "address": "10.34.255.194",
        "elapsedTime": 16.622273,
        "hopNumber": 4,
        "hostName": "",
        "n": 60,
        "success": true,
        "ttl": 4
      },
      {
        "address": "10.38.218.73",
        "elapsedTime": 28.081027,
        "hopNumber": 5,
        "hostName": "",
        "n": 60,
        "success": true,
        "ttl": 5
      },
      {
        "address": "10.38.219.34",
        "elapsedTime": 27.367852,
        "hopNumber": 6,
        "hostName": "",
        "n": 60,
        "success": true,
        "ttl": 6
      },
      {
        "address": "10.40.130.254",
        "elapsedTime": 31.402987,
        "hopNumber": 7,
        "hostName": "",
        "n": 60,
        "success": true,
        "ttl": 7
      },
      {
        "address": "10.36.108.66",
        "elapsedTime": 37.904474,
        "hopNumber": 8,
        "hostName": "",
        "n": 60,
        "success": true,
        "ttl": 8
      },
      {
        "address": "10.36.6.121",
        "elapsedTime": 37.738806,
        "hopNumber": 9,
        "hostName": "",
        "n": 60,
        "success": true,
        "ttl": 9
      },
      {
        "address": "72.14.196.80",
        "elapsedTime": 44.931238,
        "hopNumber": 10,
        "hostName": "",
        "n": 56,
        "success": true,
        "ttl": 10
      },
      {
        "address": "108.170.250.177",
        "elapsedTime": 63.602268,
        "hopNumber": 11,
        "hostName": "",
        "n": 57,
        "success": true,
        "ttl": 11
      },
      {
        "address": "216.239.58.207",
        "elapsedTime": 56.558554,
        "hopNumber": 12,
        "hostName": "",
        "n": 57,
        "success": true,
        "ttl": 12
      },
      {
        "address": "8.8.8.8",
        "elapsedTime": 77.484311,
        "hopNumber": 13,
        "hostName": "google-public-dns-a.google.com.",
        "n": 57,
        "success": true,
        "ttl": 13
      }
    ],
    "type": "tracebeat"
}