2020年12月24日 星期四

nginx透過Reserver Proxy到docker grafana設定

grafana預設跑在3000的port上

要讓nginx可以upstream到grafana上

並不能只是在nginx上設定

grafana的init設定檔 也需要對應設定


為了讓我們方便管理

可以透過 ansible 將本機準備好的grafana.ini丟到遠端主機上

再透過docker volumn對應 將這ini檔案 對應到container內設定檔的位置

docker-compose 設定

version: '3.8'
services:
  grafana:
    image: grafana/grafana
    container_name: grafana99
    restart: always
    volumes:
        - grafana_data:/var/lib/grafana
        - /home/ozzy/docker_share/monitor/grafana.ini:/etc/grafana/grafana.ini:ro
    environment:
      - GF_SECURITY_ADMIN_PASSWORD=xxxx
    depends_on:
      - prometheus
    ports:
      - '3000:3000'

grafana.ini設定

instance_name = ozzysun.com
protocol = http
http_port = 3000
domain = ozzysun.com
enforce_domain = true
root_url = http://ozzysun.com/grafana
serve_from_sub_path = true
nginx端設定

location /grafana/ {
    proxy_pass http://192.168.0.99:3000;
    proxy_set_header Host       $http_host;
    proxy_set_header X-Real-IP    $remote_addr;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}

test

2020年12月22日 星期二

docker prometheus 儲存資料設定

當使用docker執行prometheus 有一個問題是

當有更改設定檔或是重新啟動服務

所有的資料就都清空了

要確保資料可以長久保留下來

需要將儲存資料的目錄mount到host上的資料夾


在prometheus內資料是存放在container內的 /prometheeus/data目錄下

通常docker container透過volume 去mount指定目錄就可以

但可能會遇到目錄的權限問題

open data/queries.active: permission denied


必須要將mount的host目錄權限設定與執行promethus的使用者權限才可以

譬如說我在docker compose設定以root來執行promethus

則要mount的目錄的owner 就必須要是root


 docker-compose.yml內容  
 version: '3.8'  
 services:  
  prometheus:  
   image: prom/prometheus:latest  
   user: "0:0"  
   container_name: prometheus99  
   restart: always  
   volumes:  
    - /home/ozzy/docker_share/prometheus/prometheus.yml:/etc/prometheus/prometheus.yml:ro  
    - /home/ozzy/docker_share/prometheus/prometheus_data:/prometheus  
   environment:  
    - GO15VENDOREXPERIMENT=1  
   command:  
    - '--config.file=/etc/prometheus/prometheus.yml'  
   ports:  
    - '9090:9090'  
說明
通常我會使用ansible來管理docker的佈署與更新
先將需要維護的設定檔 透過ansible 由開發本機複製到遠端主機host的指定目錄下
接下來再經由docker container mount volume到這指定的目錄下
來達到docker的資料管理都可以在遠端的host上

個人在這個地方卡了一些時間是因為
使用ansible在遠端主機上建立目錄
是指定了become: true也就是使用root建立
但在docker-compose內我並沒有特別設定執行的user
因次premethus是使用遠端主機登入的使用者ozzy執行
造成了寫紀錄的目錄與執行service是不同使用者而
造成權限問題
docker-compose設定的使用者是以設定UID
如果要查uid 可以使用以下指令
顯示目前使用者uid
echo $UID

顯示所有使用者id

 awk -F: '{printf "%s:%s\n",$1,$3}' /etc/passwd  

如果要進入promethus container內 注意 內部並沒有bash 需要改呼叫sh


docker exec -it grafanaContainer sh

2020年12月10日 星期四

nodejs express 非同步錯誤處理的error傳遞

情境

route main內執行 child()

child為非同步

非同步的child function可以是


1.以async宣告
const asyncFun = async(res) => {
  await sleep(2000)
  const result = JSON.parse(body)
  return result
}
2.以Promise宣告
const promiseFun = (res) => {
  return new Promise((resolve, reject) => {
    try {
      const result = JSON.parse(body)
      resolve(result)
    } catch (e) {
      reject(e)
    }
  })
}

如果child function內沒有使用try catch包裹

發生錯誤就會是往呼叫端(main)的catch丟
如果呼叫端(main)也沒有用try catch或是asyc 的catch攔截
錯誤就會往外 讓express的錯誤處理接收到

有一個特別的例外是當child內有使用setTimeout把執行的工作包裝起來
那麼當發生錯誤時
若在child內寫try catch是可以攔截到 但卻無法把錯誤往呼叫端丟
唯一可行的是child是使用promise寫 就可以在try catch攔截到錯誤
時呼叫reject回傳給呼叫端的catch

儘可能不要在child內直接處理res回應
否則當child發生錯誤 res回應的部份不被執行
可能造成系統掛掉

2020年12月8日 星期二

node express async程式發生錯誤時的幾種狀況

 

當執行的async程式發生錯誤時的幾種狀況

一.以try catch 包覆整個程式

1.try catch 包覆外的程式

  無論有無錯誤發生都會被執行

  常見的Cannot set headers after they are sent to the client錯誤 就是這樣發生

2.在try區塊內發生錯誤

  會直接跳到catch區塊,try內其他往下程式碼不會被執行到

3.只要有catch區塊存在

  系統會認為你有處理 就不會主動把錯誤往外丟

4.catch區塊內 以reject回應

  以reject回應錯誤,會回到呼叫端的catch

  若呼叫端沒有catch 則會在這裡發生錯誤

5.catch區塊內 以next回應

  會跳到整個app 的錯誤處理機制上

  也就是進入使用app.use()的部份處理

  

二. 沒有try catch

1.function內

  會直接發生錯誤

2.route內

  會自動往next丟 給外部的錯誤處理

2020年12月7日 星期一

妹妹補假的禮拜一

原是上班時間的禮拜一

因為學校運動會後的補假

我也請了一天假在家


老媽不在家

起床後 開始忙碌的一個早上

把衣服丟到洗衣機洗

再出門運動 發現貓在車下大便

洗了洗地板

妹妹起床 一起出門吃完早餐

再把車開去洗車廠洗車

回到家 帶妹去剪完頭髮

曬完衣服 再回家把地板用漂白水

把被貓大便過的地板 再清潔一次

煮了水餃午餐吃完

也剛好可以把洗好的車開回來

終於 一個早上把所有的事都做完


休息一下 就繼續下午跟妹要去夢時代

要去夢時代 其實是要去透幣唱歌

非假日 夢時代沒有什麼人

逛起來 很輕鬆

走到了心之和 停下來休息吃個蛋糕

喝個飲料 再上6樓唱歌

一首歌要30 實在有點貴

許多的歌還都點不到

大部份時間妹妹都是自己拿著麥克風

自己唱的很開心


晚上妹還有打鼓的課 我們也不能太晚回家

也還要趕7點倒垃圾


吃了乾麵當晚餐

送妹去上打鼓課

妹妹說 每次都是我跟老師很有話聊

聊樂器 聊音樂 聊耳機 唱盤

有一樣音樂喜好 就是可以聊到忘我






2020年12月6日 星期日

我們的旅行— 舊鐵橋 旗山

騎機車 出遊 是妹妹跟我最喜歡的旅遊方式

在fb上看到高雄市政府宣傳大樹的在地旅遊

想到其實在妹妹剛上小學時

我們也去過一次舊鐵橋

沒事的一天 就再去走走


騎著車 由鳳山往屏東的方向 一直騎

過了大寮 到高屏橋下往大樹方向走 就是了

路上妹妹一樣是一路唱著歌

很快就到了舊鐵橋

我們還找出了六年前拍的照片

當時妹妹才剛上小學一年級

今年已經是將畢業的六年級生了



想到以前88快速道路還沒好

要去家裡的果園會是走高屏大橋

清明要去掃墓 走的就是這條往大樹的方向 去杉林

這條路一直走 就是旗山了


妹妹沒去過旗山 說好了 我們就騎著車繼續前進

一路上 經過了佛光山 再往旗山

路途是遠了許多

妹妹像是不會累 還是一路唱著歌


到了旗山老街 走走拍拍照

才吃了一個臭豆腐 妹妹就想要回家了

這樣的旅行方式

也許可以讓妹妹 記得很久 很久


還沒結束!!

回到家4點多 我已經有點累了 妹還是精神很好

答應帶他去新倔江逛 稍微咪了一下

6點半多 還是出發了

到處逛逛走走

買了件衣服 再去買了些diy的線材

妹妹 也覺得累了






2020年12月5日 星期六

運動會


這禮拜就是妹妹學校的運動會

今年六年級了 也是國小最後一年的運動會

早上送妹妹去學校

先開車載老媽去屏東 再開車回來

回到家 也差不多9點半的時間

剛好可以趕上妹妹的趣味競賽


到學校操場上沒看到妹妹班級 時間還沒到

等到快11點才是高年級的活動


下午的大隊接力 結束 閉幕典禮

結束了今天全部的活動 也是妹妹六年級的運動會


每年 我都會來參加 有拍下了妹妹的照片

看著照片 妹妹 長大了

一年級


二年級

三年級


四年級

5年級

六年級