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"
}


21 Mart 2018 Çarşamba

Metricbeat Module: Etcd Module

Etcd Module is a Metricbeat Module that collects metrics from Etcd v2 API and indexes them into Elasticsearch or Logstash.
Etcd Module is written in Golang like all Metricbeat Modules and Beats.


What is the Etcd?


Etcd is an open-source distributed key value store that provides a reliable way to store data across a cluster of machines.

An etcd cluster keeps track of a number of statistics including latency, bandwidth and uptime. Etcd Module collects this stats with Etcd v2 API.



Etcd Module


We have some files in metricbeat/module/etcd.
Let's list up files in metricbeat/module/etcd:
$ tree etcd 

etcd
├── doc.go
├── leader
│   ├── data.go
│   ├── leader.go
│   ├── leader_integration_test.go
│   ├── leader_test.go
│   └── _meta
│       ├── data.json
│       ├── docs.asciidoc
│       └── fields.yml
├── _meta
│   ├── config.yml
│   ├── Dockerfile
│   ├── docs.asciidoc
│   ├── env
│   ├── fields.yml
│   └── test
│       ├── leaderstats.json
│       ├── selfstats.json
│       └── storestats.json
├── self
│   ├── data.go
│   ├── _meta
│   │   ├── data.json
│   │   ├── docs.asciidoc
│   │   └── fields.yml
│   ├── self.go
│   ├── self_integration_test.go
│   └── self_test.go
└── store
    ├── data.go
    ├── _meta
    │   ├── data.json
    │   ├── docs.asciidoc
    │   └── fields.yml
    ├── store.go
    ├── store_integration_test.go
    └── store_test.go
8 directories, 30 files

Getting Started with Etcd Module


Initially, you need to make Etcd Module enabled:

./metricbeat modules enable etcd 
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.


  • The modules.d directory contains default configurations for all modules available in Metricbeat. For more information, you can check [1]
Now Etcd Module is enabled and ready to collect metrics.

Configuration


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

Here is a sample configuration:


- module: etcd
  metricsets: ["leader", "self", "store"]
  period: 10s
  hosts: ["localhost:2379"]

module: The name of the module to run.
metricsets: A list of metricsets to execute.
period: How often the metricsets are executed.
hosts: A list of hosts of fetch information from.

Metricsets


Etcd Module has tree metricsets; leader, self and store.
You need to remove metricset that you don't want to be taken in etcd.yml located in modules.d.

For example; if you want to take only store metricset:

- module: etcd  metricsets: ["store"]  period: 10s  hosts: ["localhost:2379"]

Leader Metricset


The leader has a view of the entire cluster and keeps track of two interesting statistics: latency to each peer in the cluster and the number of failed and successful Raft RPC requests.

Here is an example document generated by this metricset:


{
    "@timestamp": "2017-10-12T08:05:34.853Z",
    "beat": {
        "hostname": "host.example.com",
        "name": "host.example.com"
    },
    "etcd": {
        "leader": {
            "followers": {},
            "leader": "8e9e05c52164694d"
        }
    },
    "metricset": {
        "host": "etcd:2379",
        "module": "etcd",
        "name": "leader",
        "rtt": 115
    }
}

Self Metricset


Each node keeps a number of internal statistics.


  • id: the unique identifier for the member
  • leaderInfo.leader: id of the current leader member
  • leaderInfo.uptime: amount of time the leader has been leader
  • name: this member's name
  • recvAppendRequestCnt: number of bytes per second this node is receiving (follower only)
  • recvBandwidthRate: number of bytes per second this node is receiving (follower only)
  • recvPkgRate: number of requests per second this node is receiving (follower only)
  • sendAppendRequestCnt: number of requests that this node has sent
  • sendBandWithRate: number of bytes per second this node is sendling (leader only). This value is undefined on single member clusters.
  • sendPkgRate: number of requests per second this node is sending (leader only).  This value is undefined on single member clusters.
  • state: either leader of follower
  • startTime: the time when this node was started

Here is an example document generated by this metricset:

{
    "@timestamp": "2017-10-12T08:05:34.853Z",
    "beat": {
        "hostname": "host.example.com",
        "name": "host.example.com"
    },
    "etcd": {
        "self": {
            "id": "8e9e05c52164694d",
            "leaderinfo": {
                "leader": "8e9e05c52164694d",
                "starttime": "2017-12-07T07:20:33.241031712Z",
                "uptime": "9m4.919923089s"
            },
            "name": "default",
            "recv": {
                "appendrequest": {
                    "count": 0
                },
                "bandwithrate": 0,
                "pkgrate": 0
            },
            "send": {
                "appendrequest": {
                    "count": 0
                },
                "bandwithrate": 0,
                "pkgrate": 0
            },
            "starttime": "2017-12-07T07:20:32.340598119Z",
            "state": "StateLeader"
        }
    },
    "metricset": {
        "host": "etcd:2379",
        "module": "etcd",
        "name": "self",
        "rtt": 115
    }
}


Store Metricset


The store statistics include information about the operations that this node has handled. Operations that modify the store's state like create, delete, set and update are seen by the entire cluster and the number will increase on all nodes.

Here is an example document generated by this metricset:


{
    "@timestamp": "2017-10-12T08:05:34.853Z",
    "beat": {
        "hostname": "host.example.com",
        "name": "host.example.com"
    },
    "etcd": {
        "store": {
            "compareanddelete": {
                "fail": 0,
                "success": 0
            },
            "compareandswap": {
                "fail": 0,
                "success": 0
            },
            "create": {
                "fail": 0,
                "success": 1
            },
            "delete": {
                "fail": 0,
                "success": 0
            },
            "expire": {
                "count": 0
            },
            "gets": {
                "fail": 1,
                "success": 35
            },
            "sets": {
                "fail": 0,
                "success": 2
            },
            "update": {
                "fail": 0,
                "success": 0
            },
            "watchers": 0
        }
    },
    "metricset": {
        "host": "etcd:2379",
        "module": "etcd",
        "name": "store",
        "rtt": 115
    }
}





Etcd Module available for Beats 6.1 version.

My Metricbeat Process

Now I am going to clarify how this process by my myself goes on apart from Etcd Module.

Etctbeat and Etcd Module were my 3-month internship project. In this way, my process of starting the contributing the Beats has begun. 

Very long before starting the internship, I had begun to the Golang and Beats under the guidance of Kaan and my teacher Necdet Yücel. And our meeting with Kaan happened thanks to Necdet Hoca.

I want to be a part of free software community and we were all agree about Beats. Everything started with my internship that I did it with Kaan for a Gamegos firm. 

We were not sure that we should make a Community Beats or Metricbeat Module with Etcd. What I mentioned here is that you can ask that on the page of discuss of elastic

In order to get used to this process, I have started to work for contributing to Etcdbeat.
The group in front of you is so much eager to work with you that they can be one of your motivation sources.

From the beginning, our aim was Metricbeat Module. Because it is an upstream project. So I have started to work for Metricbeat Module.

At that part, there is so much to learn and Module has its own necessities. On the contrary to Etcdbeat, test files were needed to be added as well. The creation process of Module was both teaching and joyful. 
I send the first pull request for Etcd Module at the last week of the internship.
After correcting a few mistakes, Etcd Module was also accepted.
And you can find in Beats 6.1 version.

Etcdbeat was my first project. And also Metricbeat Module was my first upstream project.
I learned that if you work enough, the results are very satisfying. During this period, I really appreciate both people on the side of Elastic, my teacher Necdet Yücel and Kaan.