ESP8266 / ESP32 & Mesh Network ตอนที่ 5: InfluxDB & Grafana

จริงๆเนื้อหาหลักของ Painlessmesh นั้นจบไปตั้งแต่ตอนที่ 3 แล้ว ที่เหลือจะเป็นลักษณะของการประยุกต์ใช้มากกว่า ไม่ว่าจะเป็นการ Bridge ด้วย LoRa หรือการติดตั้ง MQTT Server บน Google Cloud ซึ่งถ้านับจากตอนล่าสุดตอนที่ 4 ถึงตอนนี้ก็ผ่านไป 4 เดือนละ ก็เลยจะมาจบ Series ของ Painlessmesh นี้ตามที่เคยเกริ่นไว้ว่าจะมีทั้งหมด 5 ตอนด้วยกัน โดยตอนนี้ก็จะเป็นเหมือนตอนแถมปลายทางละ เพราะจะเป็นการนำข้อมูลต่างๆนั้นไปเก็บอยู่บน Time Series Database ที่ชื่อว่า InfluxDB และนำไปแสดงผลบน Dashboard ของ Grafana

ก่อนเข้าไปสู่การติดตั้ง InfluxDB ซึ่งเป็น Time Series Database (TSDB) โดยที่เป็นการเก็บข้อมูล เหมือนเก็บ log ที่เก็บไปเรื่อยๆเรียงตามวันที่และเวลาต่อๆกันไป เช่นข้อมูลราคาหุ้น ข้อมูลอุณหภูมิ ความชื้นในแต่ละช่วงเวลา ซึ่ง InfluxDB ก็เป็นหนึ่งใน TSDB ที่ถูก Optimize มาให้ทำงานในลักษณะนี้ โดยเน้นการทำงานที่ง่าย เร็ว ตัดพวก business logic ต่างๆไปอยู่ที่ module ข้างนอกแทน ฉะนั้นในการโยนข้อมูลเข้ามาเพื่อเขียนลงฐานข้อมูลก็จะเร็วมากและใช้พื้นที่น้อยกว่าอีกด้วย

InfluxDB ก็มีทั้งส่วนที่เป็น Commercial และ Opensource ซึ่งข้อแตกต่างหลักๆของ version ที่เสียเงินกับ Opensource นั้นก็จะเป็นในเรื่องของการ support และก็เรื่องของ High Availability  หรือการ Scale out ระบบเพื่อรองรับการทำ Clustering ระหว่างหลายๆ node ของ InfluxDB

 

แต่วันนี้เราจะมาดูในส่วนของ Opensource กันซึ่งทาง Influxdata นั้นใช้ชื่อว่า TICK Stack ซึ่งประกอบไปด้วย 4 Module ด้วยกันคือ Telegraf, InfluxDB, Chronograf และ Kapacitor

โดยที่การทำงานก็จะเป็นอย่างรูปที่แสดงอยู่ด้านบนเลยครับ

  • Telegraf จะเป็นตัวกลางในการรับข้อมูลจาก Source ต่างๆเข้ามาไม่ว่าจะเป็น Database อื่นๆหรือแม้กระทั่ง MQTT Message และรวมถึงดึงข้อมูลจาก InfluxDB และส่งกลับไปยังระบบอื่นด้วย ทำหน้าที่เหมือน ETL
  • InfluxDB ก็เป็นหัวใจของ TICK Stack นี้เลยซึ่งก็คือ Time Series Database ของเรานั่นเอง เน้นเก็บข้อมูลอย่างเดียว
  • Chronograf อันนี้จะเป็น GUI ที่ใช้ในการ Manage InfluxDB รวมถึงการทำ Dashboard ด้วย (แต่เดี่ยวเราจะไปใช้ Grafana ทำ อิอิ)
  • Kapacitor จะเป็นส่วนที่ทำในเรื่องของ Data Processing ต่างๆ เช่นเมื่อมีข้อมูลการรอสายโทรศัพท์ของลูกค้าที่โทรเข้ามาที่ Call Center เกินเท่านี้ให้ทำการ Alert แจ้งเตือนไปยังหัวหน้างาน ซึ่งก็สามารถนำ Module การวิเคราะห์ต่างๆเข้ามาใช้ได้ ไม่ว่าจะเป็นจากการตั้งค่าเอง หรือ Machine Learning ก็ได้

 

InfluxDB Setup

โดยการติดตั้งนั้นจะเริ่มจาก InfluxDB กันก่อน โดยการเปิดหน้า SSH Command Windows ของ Google Cloud แล้วพิมพ์คำสั่งต่อตามด้านล่างนี้เลยครับโดยสเตปก็จะเป็น Download & Install –> Start Service –> Verify (ใครที่อ่านตรงนี้แล้วงง อาจต้องย้อนกลับไปอ่านที่ ตอนแทรก 3.5-1 การติดตั้ง MQTT Server)

Download & Install

wget https://dl.influxdata.com/influxdb/releases/influxdb_1.4.0_amd64.deb
sudo dpkg -i influxdb_1.4.0_amd64.deb

Start InfluxDB

sudo systemctl start influxdb

Verify

curl "http://localhost:8086/query?q=show+databases"

 

ถ้า InfluxDB ที่เราเพิ่งติดตั้งไปทำงานได้อย่างถูกต้องแล้วหละก็ จะแสดงผลลัพท์ตามบรรทัดล่างนี้เลยครับ

{"results":[{"statement_id":0,"series":[{"name":"databases","columns":["name"],"values":[["_internal"]]}]}]}

 

Kapacitor Setup

มาถึง Module ที่สองที่เราจะทำการติดตั้งกัน เพื่อใช้ในการทำ Data Processing ซึ่งถ้าใครไม่ได้ใช้งานก็สามารถข้ามไปที่ Module ถัดไปได้ครับ

Download & Install

wget https://dl.influxdata.com/kapacitor/releases/kapacitor_1.4.0_amd64.deb

sudo dpkg -i kapacitor_1.4.0_amd64.deb

Start Kapacitor

sudo systemctl start kapacitor

Verify

kapacitor list tasks

 

ซึ่งถ้าติดตั้งและ Service Start เรียบร้อยแล้ว ผลลัพท์ที่ได้จะเป็นดังนี้ครับ

ID                            Type      Status    Executing Databases and Retention Policies

 

Telegraf Setup

Module Telegraf นี้เรียกได้ว่าเป็นอีกหัวใจหลักเลยก็ว่าได้ครับ เพราะจะเป็นตัวที่เก็บรวบรวม ดึงข้อมูลจาก Source ต่างๆเพื่อที่จะโยนเข้า InfluxDB ในตัวอย่างนี้เราจะเรียกเก็บ System Stat ของ VM Instance ของเรากันด้วยเพื่อดู load ของ CPU / RAM กัน

 

Download & Install

wget https://dl.influxdata.com/telegraf/releases/telegraf_1.4.3-1_amd64.deb

sudo dpkg -i telegraf_1.4.3-1_amd64.deb

 

Start Service

sudo systemctl start telegraf

 

Verify

ขั้นตอนนี้จะแตกต่างจาก Module อื่นๆ อย่างที่เกริ่นกันไว้ เราจะดึงข้อมูล System Stat ของระบบของเรามา โดยการทำงานของ Telegraf จะทำงานผ่าน Plug-in ต่างๆ โดยขั้นแรกให้เปิดไฟล์ /etc/telegraf/telegraf.conf จากนั้นให้ดูในส่วนของ Output Plugins (จะใช้โปรแกรม vi, pico , nano อันนี้ก็แล้วแต่สะดวกกันเลยครับ)

[[outputs.influxdb]]
  ## The full HTTP or UDP endpoint URL for your InfluxDB instance.
  ## Multiple urls can be specified as part of the same cluster,
  ## this means that only ONE of the urls will be written to each interval.
  # urls = ["udp://localhost:8089"] # UDP endpoint example
  urls = ["http://localhost:8086"] # required
  ## The target database for metrics (telegraf will create it if not exists).
  database = "telegraf" # required

  ## Retention policy to write to. Empty string writes to the default rp.
  retention_policy = ""
  ## Write consistency (clusters only), can be: "any", "one", "quorum", "all"
  write_consistency = "any"

  ## Write timeout (for the InfluxDB client), formatted as a string.
  ## If not provided, will default to 5s. 0s means no timeout (not recommended).
  timeout = "5s"
  # username = "telegraf"
  # password = "metricsmetricsmetricsmetrics"
  ## Set the user agent for HTTP POSTs (can be useful for log differentiation)
  # user_agent = "telegraf"
  ## Set UDP payload size, defaults to InfluxDB UDP Client default (512 bytes)
  # udp_payload = 512

 

และในส่วนของ Input Plugins นั้นก็ควรจะมีหน้าตาลักษณะแบบนี้ ในการดึงค่า System Stat ออกมาเพื่อโยนเป็น Output ให้กับ InfluxDB

# Read metrics about cpu usage
[[inputs.cpu]]
  ## Whether to report per-cpu stats or not
  percpu = true
  ## Whether to report total system cpu stats or not
  totalcpu = true
  ## If true, collect raw CPU time metrics.
  collect_cpu_time = false


# Read metrics about disk usage by mount point
[[inputs.disk]]
  ## By default, telegraf gather stats for all mountpoints.
  ## Setting mountpoints will restrict the stats to the specified mountpoints.
  # mount_points = ["/"]

  ## Ignore some mountpoints by filesystem type. For example (dev)tmpfs (usually
  ## present on /run, /var/run, /dev/shm or /dev).
  ignore_fs = ["tmpfs", "devtmpfs"]


# Read metrics about disk IO by device
[[inputs.diskio]]
  ## By default, telegraf will gather stats for all devices including
  ## disk partitions.
  ## Setting devices will restrict the stats to the specified devices.
  # devices = ["sda", "sdb"]
  ## Uncomment the following line if you need disk serial numbers.
  # skip_serial_number = false


# Get kernel statistics from /proc/stat
[[inputs.kernel]]
  # no configuration


# Read metrics about memory usage
[[inputs.mem]]
  # no configuration


# Get the number of processes and group them by status
[[inputs.processes]]
  # no configuration


# Read metrics about swap memory usage
[[inputs.swap]]
  # no configuration


# Read metrics about system load & uptime
[[inputs.system]]
  # no configuration

 

ซึ่งจริงๆแล้วทั้งในส่วนของ Output/Input Plugins นั้นก็เป็นค่า Default ที่ติดตั้งมาพร้อมกับ Telegraf อยู่แล้วครับ เสร็จแล้วก็ทดลองรันคำสั่งนี้กันดู

curl "http://localhost:8086/query?q=select+*+from+telegraf..cpu"

ถ้า Telegraf ทำงาน ก็จะแสดงผลยาวพรึ้ดออกมาเป็นรูปแบบ JSON ให้ได้เห็นกันเต็มหน้าจอเลย

 

Chronograf Setup

มาถึง Module สุดท้ายของ TICK Stack กันละครับสำหรับหน้า GUI เพื่อใช้ในการ Config และแสดงผล สำหรับผมแล้วเอาไปทำบน Grafana น่าจะสะดวกกว่า แต่ไหนๆก็ไหนๆแล้ว Install กันให้ครบเลยดีกว่าครับ เป็นทางเลือก

Download & Install

wget https://dl.influxdata.com/chronograf/releases/chronograf_1.4.0.0_amd64.deb

sudo dpkg -i chronograf_1.4.0.0_amd64.deb

Start Service

sudo systemctl start chronograf

Verify

ขั้นตอนนี้ก็ให้เข้าไปที่ http://localhost:8888โดยเปลี่ยน local host เป็น ip หรือ hostname ของเราครับ ก็จะได้หน้า Web GUI ของ Chronograf ดังแสดงในรูปด้านล่างนี้ สำหรับใครที่ใช้ Google Cloud ก็อย่าลืมเข้าไปเซทในส่วนของ Firewall Rule ให้ Allow Port 8888 ด้วยนะครับ วิธีการก็หาดูได้จากตอนที่ 3.5 ได้เลย

หลังจากนั้นก็คลิกที่ปุ่ม +Add Source เลยครับ ค่าที่อยู่ให้คง Default ไว้ เนื่องจากในการติดตั้งครั้งแรกนั้น Default Security ของ InfluxDB นั้นจะไม่มี Username/Password ซึ่งเดี่ยวเราจะได้มา config กันในช่วงต่อไปครับ ซึ่งหลังจาก Add Source แล้วก็จะเข้าสู่หน้าจอถัดไป ให้ทำการเลือก Host ที่เราใช้ Plugin ของ Telegraf ในการดึง System Stat มาใส่ไว้ใน InfluxDB

 

ถ้าทุกอย่างทำงานได้อย่างถูกต้องเราก็จะได้หน้า Dashboard ที่ใช้ในการแสดงผล System Stat ที่ได้จากการถึงข้อมูลผ่านทาง Plugin Module ของ Telegraf และโยนข้อมูลที่ได้ไปไว้ใน InfluxDB และนำมาแสดงผลบน Chronograf

 

แต่ยังไม่จบครับ เพราะ TICK Stack นั้นมีอยู่ด้วยกัน 4 Module นี่เราเพิ่งจะใช้งานไปแค่ 3 Module เอง ยังเหลือในส่วนของ Kapacitor ที่ใช้ในการทำ Data Processing/Analysis และ Alert ต่างๆ จากหน้า Dashboard System Stat ของเราก็คลิกที่ Config เพื่อ connect ไปยัง Kapacitor แต่ผมจะขอหยุดไว้เท่านี้ก่อนดีกว่า เพราะถ้าเราทำใน Grafana นั้นในส่วนของ Dashboard และ Alert เราสามารถทำได้จาก Grafana ในที่เดียวกันเลย เราจึงมักเห็นการจับคู่กันเฉพาะในส่วนของ MQTT –> Telgraf–> InfluxDB–>Grafana เรียกได้ว่าเป็นสูตรสำเร็จสำหรับการเก็บข้อมูลมาแสดงผลของงาน IOT เลยครับ

แต่ก่อนอื่น เรามาเซทระบบของเราให้เข้าที่เข้าทางกันก่อนดีกว่า เพราะก่อนหน้านี้ที่เรา Install InfluxDB ไปค่า Default ของระบบยังไม่มีในส่วนของ User/Password และการ Authen ต่างๆ ขั้นตอนแรกเราก็จะมาสร้าง User Admin ของระบบกันด้วยคำสั่ง influx และตามด้วยคำสั่งด้านล่างนี้ครับ

CREATE USER "admin" WITH PASSWORD 'admin_passwd' WITH ALL PRIVILEGES


ในส่วนของ admin_passwd ก็เปลี่ยนเอาตามใจชอบได้เลยครับ

 

หลังจากนั้นก็ใช้คำสั่ง show users ในการเรียกดู user ทั้งหมดที่มีอยู่ ตามรูปด้านล่างนี้

 

โดยทำการแก้ไขไฟล์ /etc/influxdb/influxdb.conf ในส่วนของ [auth-enabled] ให้เป็น true ซึ่งหน้าตาของ config ที่แก้ไขก็จะเหมือนกับด้านล่างนี้

เมื่อเพิ่ม user admin และแก้ไขไฟล์ influxdb.conf แล้ว จากนั้นก็ restart service ของ influxdb ด้วยคำสั่ง sudo systemctl restart influxdbก็เป็นอันเสร็จสิ้นการปรับแต่ง influxdb ของเราให้มีการ Authen ก่อนเข้าใช้งาน ถ้าทดลอง list user ในระบบด้วยคำสั่ง show users โดยที่ไม่มีการใส่ username/password ก็จะแสดง error แบบด้านล่างนี้ครับ

ดังนั้นการใช้งานหลังกจากนี้ที่หน้า command line ให้เพิ่มคำสั่งในส่วนของ -username และ -password เข้าไปก่อนก็จะสามารถใช้งานได้ครับ

 

คราวนี้เราจะมาแก้ไข config ในส่วนของ Telegraf กันเพื่อให้ไปดึงข้อมูลจาก MQTT Server ของเราที่ได้สร้างไว้กันตั้งแต่ตอนที่ 3.5 กัน โดยแก้ไขไฟล์ /etc/telegraf/telegraf.conf ในส่วนของ[[inputs.mqtt_consumer]] ตามด้านล่างนี้เลยครับ

[[inputs.mqtt_consumer]]
   servers = ["xxx.xxx.xxx.xxx:1883"] #<-- IP ของ mqtt server
   qos = 0
   connection_timeout = "30s"
   topics = ["env",] #<-- topic ที่เราต้องการดึงข้อมูลมา
   username = "xxx" #<-- username ของ mqtt server
   password = "xxx" #<-- password ของ mqtt server
   data_format = "influx" #<-- รูปแบบของ Data ที่ต้องการดึง

มาดูในส่วนของ influx line format กันบ้าง ซึ่งรูปแบบของข้อมูลที่ Telegraf รองรับนั้นก็มีหลายรวมถึง JSON ด้วย ถ้าสนใจจะใช้ format อื่นก็ดูจากลิงค์นี้ได้เลยครับ telegraf input data formats

เนื่องจากตอนนี้เราจะมีการเขียนข้อมูลลงฐานข้อมูลของ InfluxDB 2 ตัวด้วยกัน โดยตัวแรกก่อนหน้านี้คือ Default ที่มาจากการติดตั้ง Telegraf ซึ่งเป็นข้อมูลพวก System Stat อีกอันก็จะเป็นข้อมูลที่เราได้มาจาก Node ที่ส่งข้อมูลมาที่ MQTT Server (ในที่นี้จำลองส่งข้อมูลอุณหภูมิเข้ามา) ฉะนั้นเราต้องบอก Telegraf ว่าข้อมูลไหนจะเก็บลงฐานข้อมูลไหน โดยการใช้ namedrop, namepass ตามตัวอย่างด้านล่างนี้ครับ

[[outputs.influxdb]] #<-- ใช้เขียนข้อมูล System Stat ลง InfluxDB โดยเก็บที่านข้อมูล telegraf

  urls = ["http://localhost:8086"] # required
  database = "telegraf" # required
  retention_policy = ""
  write_consistency = "any"
  timeout = "5s"
  username = "xxx"  #<-- username ของ InfluxDB
  password = "xxx"  #<-- password ของ InfluxDB
  namedrop = ["env*"] #<-- ให้ drop ข้อมูลที่ขึ้นต้นด้วย env ซึ่งเป็น measurement  

[[outputs.influxdb]] #<-- ใช้เขียนข้อมูล System Stat ลง InfluxDB โดยเก็บที่านข้อมูล telegraf
  urls = ["http://localhost:8086"]
  database = "envdb" # required
  retention_policy = ""
  write_consistency = "any"
  timeout = "5s"
  username = "xxx" #<-- username ของ InfluxDB
  password = "xxx" #<-- password ของ InfluxDB
  namepass = ["env*"] #<-- ข้อมูลที่ขึ้นต้นด้วย env ซึ่งเป็น measurement ให้เขียนลงฐานข้อมูล

 

จากนั้นทำการ Restart Service

$ systemctl daemon-reload
$ sudo systemctl restart telegraf
$ sudo systemctl status telegraf

 

ส่วน influx line format นั้นก็ง่ายที่สุดเลยครับ ยกตัวอย่าง ตามด้านล่างเป็นข้อมูลที่ Nodemcu ส่งไปที่ MQTT  Server

env,location=RST temp_in=25.60,temp_out=25.40

หรือถ้าใครยังไม่มีข้อมูลส่งเข้าไปที่ MQTT Server ก็ทำการ inset ข้อมูลเองโดยใช้คำสั่งนี้ที่หน้า command line ของ influx เลยครับ INSERT env,location=RST temp_in=25.60,temp_out=25.40

 

ซึ่งการเก็บข้อมูลใน InfluxDB จะแยกเป็น Measurement, TAG Key – TAG Value และ Field Key – Field Value จากตัวอย่างข้อมูลข้างบนนั้น ผมเข้าหน้า command line แล้วใช้คำสั่งแสดงค่าดังต่อไปนี้

Measurement มีแค่ตัวเดียวคือ env

TAG Key ประกอบไปด้วย host, location, และ topic

และ temp_in, temp_out เป็น Field Key

 

Grafana

ขั้นตอนการติดตั้ง Grafana ซึ่งโดยปกติก็สามารถติดตั้งได้ผ่าน apt-get install แต่บางเครื่องนั้นอาจจะไม่ได้มีข้อมูล repository ของ Grafana อยู่ด้วยฉะนั้นเราต้องทำการ เพิ่มรายการของ Grafana เข้าไปในลิสต์ก่อนที่จะทำการติดตั้ง

curl https://packagecloud.io/gpg.key | sudo apt-key add -


จากนั้นตามด้วยคำสั่ง


sudo add-apt-repository "deb https://packagecloud.io/grafana/stable/debian/ stretch main"



sudo apt-get update

เมื่อทำการ Update List เรียบร้อยแล้วก็สามารถทำการติดตั้งได้ด้วยคำสั่ง sudo apt-get install grafana

 

หลังจากที่ติดตั้งเสร็จแล้วก็ทำการ Start Service และเช็คสถานะกันหน่อย

sudo systemctl start grafana-server


sudo systemctl status grafana-server

 

ถ้า Service ของ Grafana ทำงานเป็นปกติก็จะขึ้นข้อมูลแสดงสถานะดังนี้ครับ

จากนั้นก็ตั้งค่าให้ Grafana เริ่มต้นทุกครั้งถ้ามีการรีบูตด้วยคำสั่ง sudo systemctl enable grafana-server

ซึ่งค่า Default Port ของ Grafana นั้นคือ port 3000 ดังนั้นถ้าใครใช้ Google Cloud ก็อย่าลืมไป allow port ให้ connection จากข้างนอกสามารถเข้าถึง VM Instance ของเราจาก port 3000 ได้ด้วยนะครับ ซึ่งการใช้งานก็เข้าได้จากหน้า Browser เลย

โดยที่ Default Username/Password ตั้งต้นเลยก็คือ admin/admin ครับ เมื่อ login เข้าไปแล้วระบบก็จะให้เราเปลี่ยน password ของ admin ใหม่ทันทีก็จะเข้าสู่หน้าถัดไป ซึ่ง Grafana นั้นก็ออกแบบขั้นตอนเป็นสเตปมาให้อย่างดีเมื่อติดตั้งเสร็จก็ เพิ่ม Datasource จากนั้นก็สร้าง Dashboard ครั้นจะใช้คนเดียวก็ไม่ดี ก็สามารถ Invite คนอื่นเข้ามาใช้งานร่วมกันได้ รวมถึงรองรับ Plugin ต่างๆด้วย

 

เราจะมา Add Data source แรกกัน ซึ่งก็คือ Data source System Stat ที่ได้มาจากการดึงข้อมูลของ Telegraf ในตอนต้นนั่นเอง ให้คลิก Add Data Source จากนั้นก็ใส่ข้อมูลตามที่เรา config ไว้

 

หลังจากที่เราเพิ่ม Data Source แรกของเราไปแล้ว ขั้นต่อไปก็เป็นการสร้าง Dashboard ของเรากัน โดยเข้าไปที่ New Dashboard และเพิ่ม Graph เข้าไปยัง Dashboard แรกของเรา

 

จากนั้นคลิกที่ชื่อ Panel แล้วเลือก Edit เพื่อทำการเลือก Data Source ว่าจะเอาข้อมูลไหนมาสร้างกราฟ

 

ให้เลือก Data Source System Stat ที่เราสร้างกันไว้ แล้วเลือกข้อมูลตามที่ต้องการเลยครับ จะเป็น CPU, Mem หรือ Disk i/o ก็ได้ โดยตัวอย่างผมดึง CPU Usage มาแสดงบนกราฟ

หลังจากนี้ก็ขึ้นอยู่กับการประยุกต์ใช้งานกันละครับ ถ้าได้อ่านจากตอนที่ 1 รวมตอนแทรกจนมาถึงตอนที่ 5 ที่ปิดจบ Series ของการใช้งาน Painlessmesh แล้ว ก็จะทำได้ตั้งแต่การใช้งาน nodemcu ในการรับและส่งข้อมูลผ่านทาง mesh network การ bridge ข้อมูลผ่าน serial communication, lora network แล้วส่งต่อไปยัง MQTT broker อย่าง Mosquitto MQTT ซึ่งทำให้เราสามารถควบคุมอุปกรณ์ผ่านทาง MQTT หรือนำข้อมูลไปเก็บใน Time Series Database อย่าง InfluxDB และนำไปแสดงผลผ่านทาง Dashboard ในตอนที่ 5 นี้

เป็นเนื้อหาการเขียนบล้อคที่เป็น Series ชุดยาวหลายตอนเลยทีเดียว มีออกทะเล ออกไปเนื้อหาอื่นบ้านตามรายทาง เนื่องจากคนเขียนเอาแต่ใจ อิอิ เนื้อหาตอนถัดไปจะเป็นอะไรก็คงต้องติดตามกันต่อไปครับ มีสาระบ้าง ไม่มีสาระบ้าง แล้วเจอกันตอนต่อไปครับ

 

Author: Joe D.S.
Just a man on earth

Leave a Reply

Your email address will not be published. Required fields are marked *

This site uses Akismet to reduce spam. Learn how your comment data is processed.